From b8e9adb1f0d3382d0c3ef52c0952deb093bd29f9 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sun, 24 Oct 2021 23:33:01 -0700 Subject: [PATCH] Add hierarchical interrupts under examples The SystemRDL that was added comes from Section 17.2 "Understanding hierarchical interrupts in SystemRDL" of the SystemRDL 2.0 LRM. The present code succesfully compiles. --- examples/interrupt_hierarchy/README.md | 8 + .../images/block_interrupt_example.jpg | Bin 0 -> 98002 bytes .../hierarchical_interrupt_structure.jpg | Bin 0 -> 87509 bytes .../interrupt_hierarchy.rdl | 377 +++ .../srdl2sv_out/interrupt_hierarchy.sv | 2743 +++++++++++++++++ .../srdl2sv_out/srdl2sv_amba3ahblite.sv | 314 ++ .../srdl2sv_out/srdl2sv_if_pkg.sv | 18 + 7 files changed, 3460 insertions(+) create mode 100644 examples/interrupt_hierarchy/README.md create mode 100644 examples/interrupt_hierarchy/images/block_interrupt_example.jpg create mode 100644 examples/interrupt_hierarchy/images/hierarchical_interrupt_structure.jpg create mode 100644 examples/interrupt_hierarchy/interrupt_hierarchy.rdl create mode 100644 examples/interrupt_hierarchy/srdl2sv_out/interrupt_hierarchy.sv create mode 100644 examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_amba3ahblite.sv create mode 100644 examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_if_pkg.sv diff --git a/examples/interrupt_hierarchy/README.md b/examples/interrupt_hierarchy/README.md new file mode 100644 index 0000000..f1fb6e5 --- /dev/null +++ b/examples/interrupt_hierarchy/README.md @@ -0,0 +1,8 @@ +The RDL in `interrupt_hierarchy.rdl` is copied from Section 17.2 of the SystemRDL 2.0 LRM and is meant to show how this "Advanced topic in SystemRDL" looks in compiled form. The former figure below below shows the hierarchy that this RDL will achieve. The latter image shows the block interrupt register. + +**Note that both pictures are copied from the [SystemRDL 2.0 LRM](https://www.accellera.org/images/downloads/standards/systemrdl/SystemRDL_2.0_Jan2018.pdf).** + +![hierarchical_interrupt_structure](images/hierarchical_interrupt_structure.jpg) + +![block_interrupt_example](images/block_interrupt_example.jpg) + diff --git a/examples/interrupt_hierarchy/images/block_interrupt_example.jpg b/examples/interrupt_hierarchy/images/block_interrupt_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e84c3930c389696e7d6b04bac02f61b83fd6c46 GIT binary patch literal 98002 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 Vha4gsJA^<>I1Kboz_9P?{||G4&`kgU literal 0 HcmV?d00001 diff --git a/examples/interrupt_hierarchy/images/hierarchical_interrupt_structure.jpg b/examples/interrupt_hierarchy/images/hierarchical_interrupt_structure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec95c2c3c7ccfa8a34b44335ef64c17e4258bc28 GIT binary patch literal 87509 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 LJqu8`e(m~SZ_G9q literal 0 HcmV?d00001 diff --git a/examples/interrupt_hierarchy/interrupt_hierarchy.rdl b/examples/interrupt_hierarchy/interrupt_hierarchy.rdl new file mode 100644 index 0000000..6d7b1c2 --- /dev/null +++ b/examples/interrupt_hierarchy/interrupt_hierarchy.rdl @@ -0,0 +1,377 @@ +//------------------------------------------------------------ +// Block Level Interrupt Register +//------------------------------------------------------------ + +reg block_int_r { + name = "Example Block Interrupt Register"; + desc = "This is an example of an IP Block with 3 int events. 2 of these + are non-fatal and the third event multi_bit_ecc_error is fatal"; + + default hw=w; // HW can Set int only + default sw=rw; // SW can clear + default woclr; // Clear is via writing a 1 + + field { + desc = "A Packet with a CRC Error has been received"; + level intr; + } crc_error = 0x0; + + field { + desc = "A Packet with an invalid length has been received"; + level intr; + } len_error = 0x0; + + field { + desc="An uncorrectable multi-bit ECC error has been received"; + level intr; + } multi_bit_ecc_error = 0 ; + + field { + desc="Master who was active when ECC Error Occurred"; + sticky; + } active_ecc_master[7:4] = 0; // Example of multi-bit sticky field + // This field is not an intr +}; // End of Reg: block_int_r + +reg block_int_en_r { + name = "Example Block Interrupt Enable Register"; + desc = "This is an example of an IP Block with 3 int events"; + + default hw=na; // HW can't access the enables + default sw=rw; // SW can control them + + field { + desc = "Enable: A Packet with a CRC Error has been received"; + } crc_error = 0x1; + + field { + desc = "Enable: A Packet with an invalid length has been received"; + } len_error = 0x1; + + field { + desc = "Enable: A multi-bit error has been detected"; + } multi_bit_ecc_error = 0x0; +}; // End of Reg: block_int_en_r + +reg block_halt_en_r { + name = "Example Block Halt Enable Register"; + desc = "This is an example of an IP Block with 3 int events"; + + default hw=na; // HW can't access the enables + default sw=rw; // SW can control them + + field { + desc = "Enable: A Packet with a CRC Error has been received"; + } crc_error = 0x0; // not a fatal error do not halt + + field { + desc = "Enable: A Packet with an invalid length has been received"; + } len_error = 0x0; // not a fatal error do not halt + + field { + desc = "Enable: A Packet with an invalid length has been received"; + } multi_bit_ecc_error = 0x1; // fatal error that will + // cause device to halt +}; // End of Reg: block_halt_en_r + +//------------------------------------------------------------ +// Master Interrupt Status Register +//------------------------------------------------------------ + +reg master_int_r { + name = "Master Interrupt Status Register"; + desc = "This register contains the status of the 4 lower Module interrupts. + Also an interrupt signal (myMasterInt) is generated which is the 'OR' + of the four Module interrupts. A Halt signal is also generated which + represents the bitwise or the masked/enabled halt bits"; + + default nonsticky intr; // Unless we want to have to clear this separately + // from the leaf intr this should be non sticky + + default hw=w; // HW normally won't want to access this but it could + default sw=r; // Software can just read this. It clears the leaf intr's + // to clear this + field { + desc = "An interrupt has occurred with ModuleD. + Software must read the ModuleD Master Interrupt Register + in order to determine the source of the interrupt."; + } module_d_int[3:3] = 0x0; + + field { + desc = "An interrupt has occurred with ModuleC. + Software must read the ModuleC Master Interrupt Register + in order to determine the source of the interrupt."; + } module_c_int[2:2] = 0x0; + + field { + desc = "An interrupt has occurred with ModuleB. + Software must read the ModuleB Interrupt Register + in order to determine the source of the interrupt."; + } module_b_int[1:1] = 0x0; + + field { + desc = "An interrupt has occurred with ModuleA. + Software must read the ModuleA Master Interrupt Register + in order to determine the source of the interrupt."; + } module_a_int[0:0] = 0x0; +}; + +// +// The following is the accompanying enable register. Since the combinatorial +// logic for processing the interrupt is internal to the generated verilog, +// there's no need for an external port - which is realized by assigning "na" +// to the hw attribute of the specific field. This could have been defined as +// a mask register just as easily... +// + +//------------------------------------------------------------ +// Interrupt Enable Register +//------------------------------------------------------------ + +reg master_int_en_r { + name = "Master Interrupt Enable Register"; + desc = "Configurable register used in order to enable the corresponding + interrupts found in myMasterInt register."; + + default hw = na; + default sw = rw; + + field { + desc = "Interrupt enable for ModuleD Interrupts. 1 = enable, 0 = disable"; + } module_d_int_en[3:3] = 0x0; + + field { + desc = "Interrupt enable for ModuleC Interrupts. 1 = enable, 0 = disable"; + } module_c_int_en[2:2] = 0x0; + + field { + desc = "Interrupt enable for ModuleB Interrupts. 1 = enable, 0 = disable"; + } module_b_int_en[1:1] = 0x0; + + field { + desc = "Interrupt enable for ModuleA Interrupts. 1 = enable, 0 = disable"; + } module_a_int_en[0:0] = 0x0; +}; + +//------------------------------------------------------------ +// Halt Enable Register +//------------------------------------------------------------ + +// The halt en is another enable or mask that could be used to generate an +// alternate signal like a halt that represents a fatal error in the system or +// some other event NOTE: It does not have to mean fatal as the name implies +// its just another priority level for interrupts... + +reg master_halt_en_r { + name = "Master Halt Enable Register"; + desc = "Configurable register used in order to enable the corresponding + interrupts found in myMasterInt register."; + + default hw = na; + default sw = rw; + + field { + desc = "Halt enable for ModuleD Interrupts. 1 = enable, 0 = disable"; + } module_d_halt_en[3:3] = 0x0; + + field { + desc = "Halt enable for ModuleC Interrupts. 1 = enable, 0 = disable"; + } module_c_halt_en[2:2] = 0x0; + + field { + desc = "Halt enable for ModuleB Interrupts. 1 = enable, 0 = disable"; + } module_b_halt_en[1:1] = 0x0; + + field { + desc = "Halt enable for ModuelA Interrupts. 1 = enable, 0 = disable"; + } module_a_halt_en[0:0] = 0x0; +}; + +//------------------------------------------------------------ +// Global Interrupt Status Register +//------------------------------------------------------------ + +// This takes the block int which feeds the master int and then distills it +// down one more level so we end up with a single bit intr and single bit halt... + +//------------------------------------------------------------ +// Global Interrupt/Halt Enable Register +//------------------------------------------------------------ +reg final_en_r { + name = "My Final Enable Register"; + desc = "This enable allows all interrupts/halts to be suppressed + with a single bit"; + + default hw = na; + default sw = rw; + + field { + desc = "Global Interrupt Enable. 1 = enable, 0 = disable"; + } global_int_en = 0x0; + + field { + desc = "Global Halt Enable. 1 = enable, 0 = disable"; + } global_halt_en = 0x0; +}; + +reg final_int_r { + name = "My Final Int/Halt Register"; + desc = "This distills a lower level interrupts into a final bit than can be + masked"; + + default sw = r; // sw does not need to clear global_int + // (global_int is of type final_int_r) + // instead it clears itself when all master_int intr + // bits get serviced + + default nonsticky intr; + default hw = w; // w needed since dyn assign below implies interconnect to hw + // global_int.global_int->next = master_int->intr; + + field { + desc = "Global Interrupt"; + } global_int = 0x0; + + field { + desc = "Global Halt"; + } global_halt = 0x0; +}; + +addrmap interrupt_hierarchy { + signal { activelow; async; field_reset;} field_reset_n; + + name = "Sample ASIC Interrupt Registers"; + desc = "This register map is designed how one can use interrupt concepts + effectively in SystemRDL"; + + // Leaf Interrupts + + // Block A Registers + + block_int_r block_a_int; // Instance the Leaf Int Register + block_int_en_r block_a_int_en; // Instance the corresponding Int Enable + // Register + block_halt_en_r block_a_halt_en; // Instance the corresponding halt enable + // register + + // This block connects the int bits to their corresponding + // int enables and halt enables + // + block_a_int.crc_error->enable = block_a_int_en.crc_error; + block_a_int.len_error->enable = block_a_int_en.len_error; + block_a_int.multi_bit_ecc_error->enable = block_a_int_en.multi_bit_ecc_error; + block_a_int.crc_error->haltenable = block_a_halt_en.crc_error; + block_a_int.len_error->haltenable = block_a_halt_en.len_error; + block_a_int.multi_bit_ecc_error->haltenable = block_a_halt_en.multi_bit_ecc_error; + + // Block B Registers + block_int_r block_b_int @0x100; + block_int_en_r block_b_int_en; + block_halt_en_r block_b_halt_en; + + block_b_int.crc_error->enable = block_b_int_en.crc_error; + block_b_int.len_error->enable = block_b_int_en.len_error; + block_b_int.multi_bit_ecc_error->enable = block_b_int_en.multi_bit_ecc_error; + block_b_int.crc_error->haltenable = block_b_halt_en.crc_error; + block_b_int.len_error->haltenable = block_b_halt_en.len_error; + block_b_int.multi_bit_ecc_error->haltenable = block_b_halt_en.multi_bit_ecc_error; + + // Block C Registers + block_int_r block_c_int @0x200; + block_int_en_r block_c_int_en; + block_halt_en_r block_c_halt_en; + + block_c_int.crc_error->enable = block_c_int_en.crc_error; + block_c_int.len_error->enable = block_c_int_en.len_error; + block_c_int.multi_bit_ecc_error->enable = block_c_int_en.multi_bit_ecc_error; + block_c_int.crc_error->haltenable = block_c_halt_en.crc_error; + block_c_int.len_error->haltenable = block_c_halt_en.len_error; + block_c_int.multi_bit_ecc_error->haltenable = block_c_halt_en.multi_bit_ecc_error; + + // Block D Registers + block_int_r block_d_int @0x300; + block_int_en_r block_d_int_en; + block_halt_en_r block_d_halt_en; + + block_d_int.crc_error->enable = block_d_int_en.crc_error; + block_d_int.len_error->enable = block_d_int_en.len_error; + block_d_int.multi_bit_ecc_error->enable = block_d_int_en.multi_bit_ecc_error; + block_d_int.crc_error->haltenable = block_d_halt_en.crc_error; + block_d_int.len_error->haltenable = block_d_halt_en.len_error; + block_d_int.multi_bit_ecc_error->haltenable = block_d_halt_en.multi_bit_ecc_error; + + // + // Master Interrupts + // + + master_int_r master_int @0x01000; + master_int_r master_halt; + master_int_en_r master_int_en; + master_halt_en_r master_halt_en; + + // Associate the INT’s with the EN’s + master_int.module_d_int->enable = master_int_en.module_d_int_en; + master_int.module_c_int->enable = master_int_en.module_c_int_en; + master_int.module_b_int->enable = master_int_en.module_b_int_en; + master_int.module_a_int->enable = master_int_en.module_a_int_en; + + // Associate the HALT’s with the EN’s + master_halt.module_d_int->haltenable = master_halt_en.module_d_halt_en; + master_halt.module_c_int->haltenable = master_halt_en.module_c_halt_en; + master_halt.module_b_int->haltenable = master_halt_en.module_b_halt_en; + master_halt.module_a_int->haltenable = master_halt_en.module_a_halt_en; + + // Now hook the lower level leaf interrupts to the higher level interrupts + + // This connects the Implicit Or from Block A's INT reg after + // masking/enable to the next level up (master) + master_int.module_a_int->next = block_a_int->intr; + + // This connects the Implicit Or from Block B's INT reg after + // masking/enable to the next level up (master) + master_int.module_b_int->next = block_b_int->intr; + + // This connects the Implicit Or from Block C's INT reg after + // masking/enable to the next level up (master) + master_int.module_c_int->next = block_c_int->intr; + + // This connects the Implicit Or from Block D's INT reg after + // masking/enable to the next level up (master) + master_int.module_d_int->next = block_d_int->intr; + + // This connects the Implicit Or from Block A's HALT reg after + // masking/enable to the next level up (master) + master_halt.module_a_int->next = block_a_int->halt; + + // This connects the Implicit Or from Block B's HALT reg after + // masking/enable to the next level up (master) + master_halt.module_b_int->next = block_b_int->halt; + + // This connects the Implicit Or from Block C's HALT reg after + // masking/enable to the next level up (master) + master_halt.module_c_int->next = block_c_int->halt; + + // This connects the Implicit Or from Block D's HALT reg after + // masking/enable to the next level up (master) + master_halt.module_d_int->next = block_d_int->halt; + + final_int_r global_int @0x1010; + // Inst the global int/halt register + + final_en_r global_int_en @0x1014; + // Inst the global int/halt enable register + + global_int.global_int->enable = global_int_en.global_int_en; + // Associate the INT with the EN + + global_int.global_halt->haltenable = global_int_en.global_halt_en; + // Associate the HALT with the EN + + global_int.global_int->next = master_int->intr; + // Take the or of the 4 blocks in the master + // Int and create one final interrupt + + global_int.global_halt->next = master_halt->halt; + // Take the or of the 4 blocks in the master + // Int and create one final halt +}; diff --git a/examples/interrupt_hierarchy/srdl2sv_out/interrupt_hierarchy.sv b/examples/interrupt_hierarchy/srdl2sv_out/interrupt_hierarchy.sv new file mode 100644 index 0000000..806df87 --- /dev/null +++ b/examples/interrupt_hierarchy/srdl2sv_out/interrupt_hierarchy.sv @@ -0,0 +1,2743 @@ +/***************************************************************** + * + * ███████╗██████╗ ██████╗ ██╗ ██████╗ ███████╗██╗ ██╗ + * ██╔════╝██╔══██╗██╔══██╗██║ ╚════██╗██╔════╝██║ ██║ + * ███████╗██████╔╝██║ ██║██║ █████╔╝███████╗██║ ██║ + * ╚════██║██╔══██╗██║ ██║██║ ██╔═══╝ ╚════██║╚██╗ ██╔╝ + * ███████║██║ ██║██████╔╝███████╗███████╗███████║ ╚████╔╝ + * ╚══════╝╚═╝ ╚═╝╚═════╝ ╚══════╝╚══════╝╚══════╝ ╚═══╝ + * + * The present RTL was generated by srdl2sv v0.01. The RTL and all + * templates the RTL is derived from are licensed under the MIT + * license. The license is shown below. + * + * srdl2sv itself is licensed under GPLv3. + * + * Maintainer : Dennis Potter + * Report Bugs: https://git.dennispotter.eu/Dennis/srdl2sv/issues + * + * ===GENERATION INFORMATION====================================== + * + * Generation information: + * - User: : dpotter + * - Time : October 24 2021 23:17:35 + * - Path : /home/dpotter/srdl2sv/examples/interrupt_hierarchy + * - RDL file : ['interrupt_hierarchy.rdl'] + * - Hostname : ArchXPS + * + * RDL include directories: + * - + * + * Commandline arguments to srdl2sv: + * - Ouput Directory : ./srdl2sv_out + * - Stream Log Level : DEBUG + * - File Log Level : NONE + * - Use Real Tabs : False + * - Tab Width : 4 + * - Enums Enabled : True + * - Register Bus Type: amba3ahblite + * - Address width : 32 + * - Byte enables : True + * - Descriptions : {'AddrMap': False, 'RegFile': False, 'Memory': False, 'Register': False, 'Field': False} + * + * ===LICENSE OF INTERRUPT_HIERARCHY.SV===================================== + * + * Copyright 2021 Dennis Potter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + ****************************************************************/ +module interrupt_hierarchy + import srdl2sv_if_pkg::*; +( + // Resets + input field_reset_n, + + // Inputs + input clk , + input HRESETn , + input [31:0] HADDR , + input HWRITE , + input [2:0] HSIZE , + input [3:0] HPROT , + input [1:0] HTRANS , + input [32-1:0] HWDATA , + input HSEL , + input logic [0:0] block_a_int__crc_error_in , + input logic [0:0] block_a_int__len_error_in , + input logic [0:0] block_a_int__multi_bit_ecc_error_in, + input logic [3:0] block_a_int__active_ecc_master_in , + input logic [0:0] block_b_int__crc_error_in , + input logic [0:0] block_b_int__len_error_in , + input logic [0:0] block_b_int__multi_bit_ecc_error_in, + input logic [3:0] block_b_int__active_ecc_master_in , + input logic [0:0] block_c_int__crc_error_in , + input logic [0:0] block_c_int__len_error_in , + input logic [0:0] block_c_int__multi_bit_ecc_error_in, + input logic [3:0] block_c_int__active_ecc_master_in , + input logic [0:0] block_d_int__crc_error_in , + input logic [0:0] block_d_int__len_error_in , + input logic [0:0] block_d_int__multi_bit_ecc_error_in, + input logic [3:0] block_d_int__active_ecc_master_in , + + // Outputs + output HREADYOUT , + output HRESP , + output [32-1:0] HRDATA , + output logic block_a_int_intr, + output logic block_a_int_halt, + output logic block_b_int_intr, + output logic block_b_int_halt, + output logic block_c_int_intr, + output logic block_c_int_halt, + output logic block_d_int_intr, + output logic block_d_int_halt, + output logic master_int_intr , + output logic master_halt_intr, + output logic master_halt_halt, + output logic global_int_intr , + output logic global_int_halt +); + + +// Internal signals +b2r_t b2r; +r2b_t r2b; + +/******************************************************************* + * AMBA 3 AHB Lite Widget + * ====================== + * Naming conventions + * - r2b.* -> Signals from registers to bus + * - b2r.* -> Signals from bus to registers + * - H* -> Signals as defined in AMBA3 AHB Lite + * specification + * - clk -> Clock that drives registers and the bus + *******************************************************************/ +srdl2sv_amba3ahblite + #(.FLOP_REGISTER_IF (0), + .BUS_BITS (32), + .NO_BYTE_ENABLE (0)) +srdl2sv_amba3ahblite_inst + (// Outputs to internal logic + .b2r, + + // Inputs from internal logic + .r2b, + + // Bus protocol + .HRESETn, + .HCLK (clk), + .HADDR, + .HWRITE, + .HSIZE, + .HPROT, + .HTRANS, + .HWDATA, + .HSEL, + + .HREADYOUT, + .HRESP, + .HRDATA); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_a_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_a_int_active ; +logic block_a_int_sw_wr ; +logic [31:0] block_a_int_data_mux_in ; +logic block_a_int_rdy_mux_in ; +logic block_a_int_err_mux_in ; +logic [0:0] block_a_int__crc_error_q ; +logic [0:0] block_a_int__crc_error_sticky_latch ; +logic [0:0] block_a_int__len_error_q ; +logic [0:0] block_a_int__len_error_sticky_latch ; +logic [0:0] block_a_int__multi_bit_ecc_error_q ; +logic [0:0] block_a_int__multi_bit_ecc_error_sticky_latch; +logic [3:0] block_a_int__active_ecc_master_q ; +logic [3:0] block_a_int__active_ecc_master_sticky_latch; + + +// Register-activation for 'block_a_int' +assign block_a_int_active = b2r.addr == 0; +assign block_a_int_sw_wr = block_a_int_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_a_int[0:0]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int__crc_error_q <= 0; +end +else +begin + if (block_a_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_a_int__crc_error_q[0:0] <= block_a_int__crc_error_q[0:0] & ~b2r.data[0:0]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_a_int__crc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_a_int__crc_error_q[i] <= 1'b1; + end + end + end +end // of block_a_int__crc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_a_int__crc_error_sticky_latch = block_a_int__crc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_a_int[1:1]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int__len_error_q <= 0; +end +else +begin + if (block_a_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_a_int__len_error_q[0:0] <= block_a_int__len_error_q[0:0] & ~b2r.data[1:1]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_a_int__len_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_a_int__len_error_q[i] <= 1'b1; + end + end + end +end // of block_a_int__len_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_a_int__len_error_sticky_latch = block_a_int__len_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_a_int[2:2]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_a_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_a_int__multi_bit_ecc_error_q[0:0] <= block_a_int__multi_bit_ecc_error_q[0:0] & ~b2r.data[2:2]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_a_int__multi_bit_ecc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_a_int__multi_bit_ecc_error_q[i] <= 1'b1; + end + end + end +end // of block_a_int__multi_bit_ecc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_a_int__multi_bit_ecc_error_sticky_latch = block_a_int__multi_bit_ecc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : active_ecc_master (block_a_int[7:4]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'sticky'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int__active_ecc_master_q <= 0; +end +else +begin + if (block_a_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_a_int__active_ecc_master_q[3:0] <= block_a_int__active_ecc_master_q[3:0] & ~b2r.data[7:4]; + end + end + else + if (|block_a_int__active_ecc_master_sticky_latch && !(|block_a_int__active_ecc_master_q)) + begin + // Sticky. Keep value until software clears it + block_a_int__active_ecc_master_q <= block_a_int__active_ecc_master_in; + end +end // of block_a_int__active_ecc_master's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_a_int__active_ecc_master_sticky_latch = block_a_int__active_ecc_master_in; + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign block_a_int_intr = |(block_a_int__crc_error_q & block_a_int_en__crc_error_q) || |(block_a_int__len_error_q & block_a_int_en__len_error_q) || |(block_a_int__multi_bit_ecc_error_q & block_a_int_en__multi_bit_ecc_error_q); + +// Register has at least one interrupt field with halt property set +assign block_a_int_halt = |(block_a_int__crc_error_q & ~block_a_halt_en__crc_error_q) || |(block_a_int__len_error_q & ~block_a_halt_en__len_error_q) || |(block_a_int__multi_bit_ecc_error_q & ~block_a_halt_en__multi_bit_ecc_error_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_a_int_data_mux_in = {{24{1'b0}}, block_a_int__active_ecc_master_q, {1{1'b0}}, block_a_int__multi_bit_ecc_error_q, block_a_int__len_error_q, block_a_int__crc_error_q}; + +// Internal registers are ready immediately +assign block_a_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_a_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_a_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_a_int_en_active ; +logic block_a_int_en_sw_wr ; +logic [31:0] block_a_int_en_data_mux_in ; +logic block_a_int_en_rdy_mux_in ; +logic block_a_int_en_err_mux_in ; +logic [0:0] block_a_int_en__crc_error_q ; +logic [0:0] block_a_int_en__len_error_q ; +logic [0:0] block_a_int_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_a_int_en' +assign block_a_int_en_active = b2r.addr == 4; +assign block_a_int_en_sw_wr = block_a_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_a_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int_en__crc_error_q <= 1; +end +else +begin + if (block_a_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_int_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_a_int_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_a_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int_en__len_error_q <= 1; +end +else +begin + if (block_a_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_int_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_a_int_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_a_int_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_int_en__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_a_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_int_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_a_int_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_a_int_en_data_mux_in = {{29{1'b0}}, block_a_int_en__multi_bit_ecc_error_q, block_a_int_en__len_error_q, block_a_int_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_a_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_a_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_a_halt_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_a_halt_en_active ; +logic block_a_halt_en_sw_wr ; +logic [31:0] block_a_halt_en_data_mux_in ; +logic block_a_halt_en_rdy_mux_in ; +logic block_a_halt_en_err_mux_in ; +logic [0:0] block_a_halt_en__crc_error_q ; +logic [0:0] block_a_halt_en__len_error_q ; +logic [0:0] block_a_halt_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_a_halt_en' +assign block_a_halt_en_active = b2r.addr == 8; +assign block_a_halt_en_sw_wr = block_a_halt_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_a_halt_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_halt_en__crc_error_q <= 0; +end +else +begin + if (block_a_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_halt_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_a_halt_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_a_halt_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_halt_en__len_error_q <= 0; +end +else +begin + if (block_a_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_halt_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_a_halt_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_a_halt_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_a_halt_en__multi_bit_ecc_error_q <= 1; +end +else +begin + if (block_a_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_a_halt_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_a_halt_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_a_halt_en_data_mux_in = {{29{1'b0}}, block_a_halt_en__multi_bit_ecc_error_q, block_a_halt_en__len_error_q, block_a_halt_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_a_halt_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_a_halt_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_b_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_b_int_active ; +logic block_b_int_sw_wr ; +logic [31:0] block_b_int_data_mux_in ; +logic block_b_int_rdy_mux_in ; +logic block_b_int_err_mux_in ; +logic [0:0] block_b_int__crc_error_q ; +logic [0:0] block_b_int__crc_error_sticky_latch ; +logic [0:0] block_b_int__len_error_q ; +logic [0:0] block_b_int__len_error_sticky_latch ; +logic [0:0] block_b_int__multi_bit_ecc_error_q ; +logic [0:0] block_b_int__multi_bit_ecc_error_sticky_latch; +logic [3:0] block_b_int__active_ecc_master_q ; +logic [3:0] block_b_int__active_ecc_master_sticky_latch; + + +// Register-activation for 'block_b_int' +assign block_b_int_active = b2r.addr == 256; +assign block_b_int_sw_wr = block_b_int_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_b_int[0:0]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int__crc_error_q <= 0; +end +else +begin + if (block_b_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_b_int__crc_error_q[0:0] <= block_b_int__crc_error_q[0:0] & ~b2r.data[0:0]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_b_int__crc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_b_int__crc_error_q[i] <= 1'b1; + end + end + end +end // of block_b_int__crc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_b_int__crc_error_sticky_latch = block_b_int__crc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_b_int[1:1]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int__len_error_q <= 0; +end +else +begin + if (block_b_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_b_int__len_error_q[0:0] <= block_b_int__len_error_q[0:0] & ~b2r.data[1:1]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_b_int__len_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_b_int__len_error_q[i] <= 1'b1; + end + end + end +end // of block_b_int__len_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_b_int__len_error_sticky_latch = block_b_int__len_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_b_int[2:2]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_b_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_b_int__multi_bit_ecc_error_q[0:0] <= block_b_int__multi_bit_ecc_error_q[0:0] & ~b2r.data[2:2]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_b_int__multi_bit_ecc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_b_int__multi_bit_ecc_error_q[i] <= 1'b1; + end + end + end +end // of block_b_int__multi_bit_ecc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_b_int__multi_bit_ecc_error_sticky_latch = block_b_int__multi_bit_ecc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : active_ecc_master (block_b_int[7:4]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'sticky'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int__active_ecc_master_q <= 0; +end +else +begin + if (block_b_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_b_int__active_ecc_master_q[3:0] <= block_b_int__active_ecc_master_q[3:0] & ~b2r.data[7:4]; + end + end + else + if (|block_b_int__active_ecc_master_sticky_latch && !(|block_b_int__active_ecc_master_q)) + begin + // Sticky. Keep value until software clears it + block_b_int__active_ecc_master_q <= block_b_int__active_ecc_master_in; + end +end // of block_b_int__active_ecc_master's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_b_int__active_ecc_master_sticky_latch = block_b_int__active_ecc_master_in; + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign block_b_int_intr = |(block_b_int__crc_error_q & block_b_int_en__crc_error_q) || |(block_b_int__len_error_q & block_b_int_en__len_error_q) || |(block_b_int__multi_bit_ecc_error_q & block_b_int_en__multi_bit_ecc_error_q); + +// Register has at least one interrupt field with halt property set +assign block_b_int_halt = |(block_b_int__crc_error_q & ~block_b_halt_en__crc_error_q) || |(block_b_int__len_error_q & ~block_b_halt_en__len_error_q) || |(block_b_int__multi_bit_ecc_error_q & ~block_b_halt_en__multi_bit_ecc_error_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_b_int_data_mux_in = {{24{1'b0}}, block_b_int__active_ecc_master_q, {1{1'b0}}, block_b_int__multi_bit_ecc_error_q, block_b_int__len_error_q, block_b_int__crc_error_q}; + +// Internal registers are ready immediately +assign block_b_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_b_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_b_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_b_int_en_active ; +logic block_b_int_en_sw_wr ; +logic [31:0] block_b_int_en_data_mux_in ; +logic block_b_int_en_rdy_mux_in ; +logic block_b_int_en_err_mux_in ; +logic [0:0] block_b_int_en__crc_error_q ; +logic [0:0] block_b_int_en__len_error_q ; +logic [0:0] block_b_int_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_b_int_en' +assign block_b_int_en_active = b2r.addr == 260; +assign block_b_int_en_sw_wr = block_b_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_b_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int_en__crc_error_q <= 1; +end +else +begin + if (block_b_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_int_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_b_int_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_b_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int_en__len_error_q <= 1; +end +else +begin + if (block_b_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_int_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_b_int_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_b_int_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_int_en__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_b_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_int_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_b_int_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_b_int_en_data_mux_in = {{29{1'b0}}, block_b_int_en__multi_bit_ecc_error_q, block_b_int_en__len_error_q, block_b_int_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_b_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_b_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_b_halt_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_b_halt_en_active ; +logic block_b_halt_en_sw_wr ; +logic [31:0] block_b_halt_en_data_mux_in ; +logic block_b_halt_en_rdy_mux_in ; +logic block_b_halt_en_err_mux_in ; +logic [0:0] block_b_halt_en__crc_error_q ; +logic [0:0] block_b_halt_en__len_error_q ; +logic [0:0] block_b_halt_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_b_halt_en' +assign block_b_halt_en_active = b2r.addr == 264; +assign block_b_halt_en_sw_wr = block_b_halt_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_b_halt_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_halt_en__crc_error_q <= 0; +end +else +begin + if (block_b_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_halt_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_b_halt_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_b_halt_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_halt_en__len_error_q <= 0; +end +else +begin + if (block_b_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_halt_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_b_halt_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_b_halt_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_b_halt_en__multi_bit_ecc_error_q <= 1; +end +else +begin + if (block_b_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_b_halt_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_b_halt_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_b_halt_en_data_mux_in = {{29{1'b0}}, block_b_halt_en__multi_bit_ecc_error_q, block_b_halt_en__len_error_q, block_b_halt_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_b_halt_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_b_halt_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_c_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_c_int_active ; +logic block_c_int_sw_wr ; +logic [31:0] block_c_int_data_mux_in ; +logic block_c_int_rdy_mux_in ; +logic block_c_int_err_mux_in ; +logic [0:0] block_c_int__crc_error_q ; +logic [0:0] block_c_int__crc_error_sticky_latch ; +logic [0:0] block_c_int__len_error_q ; +logic [0:0] block_c_int__len_error_sticky_latch ; +logic [0:0] block_c_int__multi_bit_ecc_error_q ; +logic [0:0] block_c_int__multi_bit_ecc_error_sticky_latch; +logic [3:0] block_c_int__active_ecc_master_q ; +logic [3:0] block_c_int__active_ecc_master_sticky_latch; + + +// Register-activation for 'block_c_int' +assign block_c_int_active = b2r.addr == 512; +assign block_c_int_sw_wr = block_c_int_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_c_int[0:0]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int__crc_error_q <= 0; +end +else +begin + if (block_c_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_c_int__crc_error_q[0:0] <= block_c_int__crc_error_q[0:0] & ~b2r.data[0:0]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_c_int__crc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_c_int__crc_error_q[i] <= 1'b1; + end + end + end +end // of block_c_int__crc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_c_int__crc_error_sticky_latch = block_c_int__crc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_c_int[1:1]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int__len_error_q <= 0; +end +else +begin + if (block_c_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_c_int__len_error_q[0:0] <= block_c_int__len_error_q[0:0] & ~b2r.data[1:1]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_c_int__len_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_c_int__len_error_q[i] <= 1'b1; + end + end + end +end // of block_c_int__len_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_c_int__len_error_sticky_latch = block_c_int__len_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_c_int[2:2]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_c_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_c_int__multi_bit_ecc_error_q[0:0] <= block_c_int__multi_bit_ecc_error_q[0:0] & ~b2r.data[2:2]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_c_int__multi_bit_ecc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_c_int__multi_bit_ecc_error_q[i] <= 1'b1; + end + end + end +end // of block_c_int__multi_bit_ecc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_c_int__multi_bit_ecc_error_sticky_latch = block_c_int__multi_bit_ecc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : active_ecc_master (block_c_int[7:4]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'sticky'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int__active_ecc_master_q <= 0; +end +else +begin + if (block_c_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_c_int__active_ecc_master_q[3:0] <= block_c_int__active_ecc_master_q[3:0] & ~b2r.data[7:4]; + end + end + else + if (|block_c_int__active_ecc_master_sticky_latch && !(|block_c_int__active_ecc_master_q)) + begin + // Sticky. Keep value until software clears it + block_c_int__active_ecc_master_q <= block_c_int__active_ecc_master_in; + end +end // of block_c_int__active_ecc_master's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_c_int__active_ecc_master_sticky_latch = block_c_int__active_ecc_master_in; + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign block_c_int_intr = |(block_c_int__crc_error_q & block_c_int_en__crc_error_q) || |(block_c_int__len_error_q & block_c_int_en__len_error_q) || |(block_c_int__multi_bit_ecc_error_q & block_c_int_en__multi_bit_ecc_error_q); + +// Register has at least one interrupt field with halt property set +assign block_c_int_halt = |(block_c_int__crc_error_q & ~block_c_halt_en__crc_error_q) || |(block_c_int__len_error_q & ~block_c_halt_en__len_error_q) || |(block_c_int__multi_bit_ecc_error_q & ~block_c_halt_en__multi_bit_ecc_error_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_c_int_data_mux_in = {{24{1'b0}}, block_c_int__active_ecc_master_q, {1{1'b0}}, block_c_int__multi_bit_ecc_error_q, block_c_int__len_error_q, block_c_int__crc_error_q}; + +// Internal registers are ready immediately +assign block_c_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_c_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_c_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_c_int_en_active ; +logic block_c_int_en_sw_wr ; +logic [31:0] block_c_int_en_data_mux_in ; +logic block_c_int_en_rdy_mux_in ; +logic block_c_int_en_err_mux_in ; +logic [0:0] block_c_int_en__crc_error_q ; +logic [0:0] block_c_int_en__len_error_q ; +logic [0:0] block_c_int_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_c_int_en' +assign block_c_int_en_active = b2r.addr == 516; +assign block_c_int_en_sw_wr = block_c_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_c_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int_en__crc_error_q <= 1; +end +else +begin + if (block_c_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_int_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_c_int_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_c_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int_en__len_error_q <= 1; +end +else +begin + if (block_c_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_int_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_c_int_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_c_int_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_int_en__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_c_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_int_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_c_int_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_c_int_en_data_mux_in = {{29{1'b0}}, block_c_int_en__multi_bit_ecc_error_q, block_c_int_en__len_error_q, block_c_int_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_c_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_c_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_c_halt_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_c_halt_en_active ; +logic block_c_halt_en_sw_wr ; +logic [31:0] block_c_halt_en_data_mux_in ; +logic block_c_halt_en_rdy_mux_in ; +logic block_c_halt_en_err_mux_in ; +logic [0:0] block_c_halt_en__crc_error_q ; +logic [0:0] block_c_halt_en__len_error_q ; +logic [0:0] block_c_halt_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_c_halt_en' +assign block_c_halt_en_active = b2r.addr == 520; +assign block_c_halt_en_sw_wr = block_c_halt_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_c_halt_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_halt_en__crc_error_q <= 0; +end +else +begin + if (block_c_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_halt_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_c_halt_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_c_halt_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_halt_en__len_error_q <= 0; +end +else +begin + if (block_c_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_halt_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_c_halt_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_c_halt_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_c_halt_en__multi_bit_ecc_error_q <= 1; +end +else +begin + if (block_c_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_c_halt_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_c_halt_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_c_halt_en_data_mux_in = {{29{1'b0}}, block_c_halt_en__multi_bit_ecc_error_q, block_c_halt_en__len_error_q, block_c_halt_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_c_halt_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_c_halt_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_d_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_d_int_active ; +logic block_d_int_sw_wr ; +logic [31:0] block_d_int_data_mux_in ; +logic block_d_int_rdy_mux_in ; +logic block_d_int_err_mux_in ; +logic [0:0] block_d_int__crc_error_q ; +logic [0:0] block_d_int__crc_error_sticky_latch ; +logic [0:0] block_d_int__len_error_q ; +logic [0:0] block_d_int__len_error_sticky_latch ; +logic [0:0] block_d_int__multi_bit_ecc_error_q ; +logic [0:0] block_d_int__multi_bit_ecc_error_sticky_latch; +logic [3:0] block_d_int__active_ecc_master_q ; +logic [3:0] block_d_int__active_ecc_master_sticky_latch; + + +// Register-activation for 'block_d_int' +assign block_d_int_active = b2r.addr == 768; +assign block_d_int_sw_wr = block_d_int_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_d_int[0:0]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int__crc_error_q <= 0; +end +else +begin + if (block_d_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_d_int__crc_error_q[0:0] <= block_d_int__crc_error_q[0:0] & ~b2r.data[0:0]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_d_int__crc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_d_int__crc_error_q[i] <= 1'b1; + end + end + end +end // of block_d_int__crc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_d_int__crc_error_sticky_latch = block_d_int__crc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_d_int[1:1]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int__len_error_q <= 0; +end +else +begin + if (block_d_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_d_int__len_error_q[0:0] <= block_d_int__len_error_q[0:0] & ~b2r.data[1:1]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_d_int__len_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_d_int__len_error_q[i] <= 1'b1; + end + end + end +end // of block_d_int__len_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_d_int__len_error_sticky_latch = block_d_int__len_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_d_int[2:2]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'intr', 'intr type', 'enable', 'haltenable'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_d_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_d_int__multi_bit_ecc_error_q[0:0] <= block_d_int__multi_bit_ecc_error_q[0:0] & ~b2r.data[2:2]; + end + end + else + begin + for (int i = 0; i < 1; i++) + begin + if (block_d_int__multi_bit_ecc_error_sticky_latch[i]) + begin + // Stickybit. Keep value until software clears it + block_d_int__multi_bit_ecc_error_q[i] <= 1'b1; + end + end + end +end // of block_d_int__multi_bit_ecc_error's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_d_int__multi_bit_ecc_error_sticky_latch = block_d_int__multi_bit_ecc_error_in; + + + +//-----------------FIELD SUMMARY----------------- +// name : active_ecc_master (block_d_int[7:4]) +// access : hw = w +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'woclr', 'desc', 'sticky'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int__active_ecc_master_q <= 0; +end +else +begin + if (block_d_int_sw_wr) + begin + if (b2r.byte_en[0]) // woclr property + begin + block_d_int__active_ecc_master_q[3:0] <= block_d_int__active_ecc_master_q[3:0] & ~b2r.data[7:4]; + end + end + else + if (|block_d_int__active_ecc_master_sticky_latch && !(|block_d_int__active_ecc_master_q)) + begin + // Sticky. Keep value until software clears it + block_d_int__active_ecc_master_q <= block_d_int__active_ecc_master_in; + end +end // of block_d_int__active_ecc_master's always_ff + +// Define signal that causes the interrupt to be set (level-type interrupt) +assign block_d_int__active_ecc_master_sticky_latch = block_d_int__active_ecc_master_in; + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign block_d_int_intr = |(block_d_int__crc_error_q & block_d_int_en__crc_error_q) || |(block_d_int__len_error_q & block_d_int_en__len_error_q) || |(block_d_int__multi_bit_ecc_error_q & block_d_int_en__multi_bit_ecc_error_q); + +// Register has at least one interrupt field with halt property set +assign block_d_int_halt = |(block_d_int__crc_error_q & ~block_d_halt_en__crc_error_q) || |(block_d_int__len_error_q & ~block_d_halt_en__len_error_q) || |(block_d_int__multi_bit_ecc_error_q & ~block_d_halt_en__multi_bit_ecc_error_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_d_int_data_mux_in = {{24{1'b0}}, block_d_int__active_ecc_master_q, {1{1'b0}}, block_d_int__multi_bit_ecc_error_q, block_d_int__len_error_q, block_d_int__crc_error_q}; + +// Internal registers are ready immediately +assign block_d_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_d_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_d_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_d_int_en_active ; +logic block_d_int_en_sw_wr ; +logic [31:0] block_d_int_en_data_mux_in ; +logic block_d_int_en_rdy_mux_in ; +logic block_d_int_en_err_mux_in ; +logic [0:0] block_d_int_en__crc_error_q ; +logic [0:0] block_d_int_en__len_error_q ; +logic [0:0] block_d_int_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_d_int_en' +assign block_d_int_en_active = b2r.addr == 772; +assign block_d_int_en_sw_wr = block_d_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_d_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int_en__crc_error_q <= 1; +end +else +begin + if (block_d_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_int_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_d_int_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_d_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int_en__len_error_q <= 1; +end +else +begin + if (block_d_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_int_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_d_int_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_d_int_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_int_en__multi_bit_ecc_error_q <= 0; +end +else +begin + if (block_d_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_int_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_d_int_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_d_int_en_data_mux_in = {{29{1'b0}}, block_d_int_en__multi_bit_ecc_error_q, block_d_int_en__len_error_q, block_d_int_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_d_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_d_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : block_d_halt_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic block_d_halt_en_active ; +logic block_d_halt_en_sw_wr ; +logic [31:0] block_d_halt_en_data_mux_in ; +logic block_d_halt_en_rdy_mux_in ; +logic block_d_halt_en_err_mux_in ; +logic [0:0] block_d_halt_en__crc_error_q ; +logic [0:0] block_d_halt_en__len_error_q ; +logic [0:0] block_d_halt_en__multi_bit_ecc_error_q; + + +// Register-activation for 'block_d_halt_en' +assign block_d_halt_en_active = b2r.addr == 776; +assign block_d_halt_en_sw_wr = block_d_halt_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : crc_error (block_d_halt_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_halt_en__crc_error_q <= 0; +end +else +begin + if (block_d_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_halt_en__crc_error_q[0:0] <= b2r.data[0:0]; + end +end // of block_d_halt_en__crc_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : len_error (block_d_halt_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_halt_en__len_error_q <= 0; +end +else +begin + if (block_d_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_halt_en__len_error_q[0:0] <= b2r.data[1:1]; + end +end // of block_d_halt_en__len_error's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : multi_bit_ecc_error (block_d_halt_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + block_d_halt_en__multi_bit_ecc_error_q <= 1; +end +else +begin + if (block_d_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + block_d_halt_en__multi_bit_ecc_error_q[0:0] <= b2r.data[2:2]; + end +end // of block_d_halt_en__multi_bit_ecc_error's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign block_d_halt_en_data_mux_in = {{29{1'b0}}, block_d_halt_en__multi_bit_ecc_error_q, block_d_halt_en__len_error_q, block_d_halt_en__crc_error_q}; + +// Internal registers are ready immediately +assign block_d_halt_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign block_d_halt_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : master_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic master_int_active ; +logic [31:0] master_int_data_mux_in ; +logic master_int_rdy_mux_in ; +logic master_int_err_mux_in ; +logic [0:0] master_int__module_a_int_q; +logic [0:0] master_int__module_b_int_q; +logic [0:0] master_int__module_c_int_q; +logic [0:0] master_int__module_d_int_q; + + +// Register-activation for 'master_int' +assign master_int_active = b2r.addr == 4096; + +//-----------------FIELD SUMMARY----------------- +// name : module_a_int (master_int[0:0]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'enable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int__module_a_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_int__module_a_int_q <= block_a_int_intr; + end +end // of master_int__module_a_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_b_int (master_int[1:1]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'enable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int__module_b_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_int__module_b_int_q <= block_b_int_intr; + end +end // of master_int__module_b_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_c_int (master_int[2:2]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'enable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int__module_c_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_int__module_c_int_q <= block_c_int_intr; + end +end // of master_int__module_c_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_d_int (master_int[3:3]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'enable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int__module_d_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_int__module_d_int_q <= block_d_int_intr; + end +end // of master_int__module_d_int's always_ff + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign master_int_intr = |(master_int__module_a_int_q & master_int_en__module_a_int_en_q) || |(master_int__module_b_int_q & master_int_en__module_b_int_en_q) || |(master_int__module_c_int_q & master_int_en__module_c_int_en_q) || |(master_int__module_d_int_q & master_int_en__module_d_int_en_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign master_int_data_mux_in = {{28{1'b0}}, master_int__module_d_int_q, master_int__module_c_int_q, master_int__module_b_int_q, master_int__module_a_int_q}; + +// Internal registers are ready immediately +assign master_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign master_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (1'b0))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : master_halt +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic master_halt_active ; +logic [31:0] master_halt_data_mux_in ; +logic master_halt_rdy_mux_in ; +logic master_halt_err_mux_in ; +logic [0:0] master_halt__module_a_int_q; +logic [0:0] master_halt__module_b_int_q; +logic [0:0] master_halt__module_c_int_q; +logic [0:0] master_halt__module_d_int_q; + + +// Register-activation for 'master_halt' +assign master_halt_active = b2r.addr == 4100; + +//-----------------FIELD SUMMARY----------------- +// name : module_a_int (master_halt[0:0]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'haltenable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt__module_a_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_halt__module_a_int_q <= block_a_int_halt; + end +end // of master_halt__module_a_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_b_int (master_halt[1:1]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'haltenable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt__module_b_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_halt__module_b_int_q <= block_b_int_halt; + end +end // of master_halt__module_b_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_c_int (master_halt[2:2]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'haltenable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt__module_c_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_halt__module_c_int_q <= block_c_int_halt; + end +end // of master_halt__module_c_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_d_int (master_halt[3:3]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['intr', 'stickybit', 'sw', 'desc', 'haltenable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt__module_d_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + master_halt__module_d_int_q <= block_d_int_halt; + end +end // of master_halt__module_d_int's always_ff + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign master_halt_intr = |(master_halt__module_a_int_q) || |(master_halt__module_b_int_q) || |(master_halt__module_c_int_q) || |(master_halt__module_d_int_q); + +// Register has at least one interrupt field with halt property set +assign master_halt_halt = |(master_halt__module_a_int_q & ~master_halt_en__module_a_halt_en_q) || |(master_halt__module_b_int_q & ~master_halt_en__module_b_halt_en_q) || |(master_halt__module_c_int_q & ~master_halt_en__module_c_halt_en_q) || |(master_halt__module_d_int_q & ~master_halt_en__module_d_halt_en_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign master_halt_data_mux_in = {{28{1'b0}}, master_halt__module_d_int_q, master_halt__module_c_int_q, master_halt__module_b_int_q, master_halt__module_a_int_q}; + +// Internal registers are ready immediately +assign master_halt_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign master_halt_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (1'b0))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : master_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic master_int_en_active ; +logic master_int_en_sw_wr ; +logic [31:0] master_int_en_data_mux_in ; +logic master_int_en_rdy_mux_in ; +logic master_int_en_err_mux_in ; +logic [0:0] master_int_en__module_a_int_en_q; +logic [0:0] master_int_en__module_b_int_en_q; +logic [0:0] master_int_en__module_c_int_en_q; +logic [0:0] master_int_en__module_d_int_en_q; + + +// Register-activation for 'master_int_en' +assign master_int_en_active = b2r.addr == 4104; +assign master_int_en_sw_wr = master_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : module_a_int_en (master_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int_en__module_a_int_en_q <= 0; +end +else +begin + if (master_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_int_en__module_a_int_en_q[0:0] <= b2r.data[0:0]; + end +end // of master_int_en__module_a_int_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_b_int_en (master_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int_en__module_b_int_en_q <= 0; +end +else +begin + if (master_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_int_en__module_b_int_en_q[0:0] <= b2r.data[1:1]; + end +end // of master_int_en__module_b_int_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_c_int_en (master_int_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int_en__module_c_int_en_q <= 0; +end +else +begin + if (master_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_int_en__module_c_int_en_q[0:0] <= b2r.data[2:2]; + end +end // of master_int_en__module_c_int_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_d_int_en (master_int_en[3:3]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_int_en__module_d_int_en_q <= 0; +end +else +begin + if (master_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_int_en__module_d_int_en_q[0:0] <= b2r.data[3:3]; + end +end // of master_int_en__module_d_int_en's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign master_int_en_data_mux_in = {{28{1'b0}}, master_int_en__module_d_int_en_q, master_int_en__module_c_int_en_q, master_int_en__module_b_int_en_q, master_int_en__module_a_int_en_q}; + +// Internal registers are ready immediately +assign master_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign master_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : master_halt_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic master_halt_en_active ; +logic master_halt_en_sw_wr ; +logic [31:0] master_halt_en_data_mux_in ; +logic master_halt_en_rdy_mux_in ; +logic master_halt_en_err_mux_in ; +logic [0:0] master_halt_en__module_a_halt_en_q; +logic [0:0] master_halt_en__module_b_halt_en_q; +logic [0:0] master_halt_en__module_c_halt_en_q; +logic [0:0] master_halt_en__module_d_halt_en_q; + + +// Register-activation for 'master_halt_en' +assign master_halt_en_active = b2r.addr == 4108; +assign master_halt_en_sw_wr = master_halt_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : module_a_halt_en (master_halt_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt_en__module_a_halt_en_q <= 0; +end +else +begin + if (master_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_halt_en__module_a_halt_en_q[0:0] <= b2r.data[0:0]; + end +end // of master_halt_en__module_a_halt_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_b_halt_en (master_halt_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt_en__module_b_halt_en_q <= 0; +end +else +begin + if (master_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_halt_en__module_b_halt_en_q[0:0] <= b2r.data[1:1]; + end +end // of master_halt_en__module_b_halt_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_c_halt_en (master_halt_en[2:2]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt_en__module_c_halt_en_q <= 0; +end +else +begin + if (master_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_halt_en__module_c_halt_en_q[0:0] <= b2r.data[2:2]; + end +end // of master_halt_en__module_c_halt_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : module_d_halt_en (master_halt_en[3:3]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + master_halt_en__module_d_halt_en_q <= 0; +end +else +begin + if (master_halt_en_sw_wr) + begin + if (b2r.byte_en[0]) + master_halt_en__module_d_halt_en_q[0:0] <= b2r.data[3:3]; + end +end // of master_halt_en__module_d_halt_en's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign master_halt_en_data_mux_in = {{28{1'b0}}, master_halt_en__module_d_halt_en_q, master_halt_en__module_c_halt_en_q, master_halt_en__module_b_halt_en_q, master_halt_en__module_a_halt_en_q}; + +// Internal registers are ready immediately +assign master_halt_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign master_halt_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : global_int +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic global_int_active ; +logic [31:0] global_int_data_mux_in ; +logic global_int_rdy_mux_in ; +logic global_int_err_mux_in ; +logic [0:0] global_int__global_int_q ; +logic [0:0] global_int__global_halt_q; + + +// Register-activation for 'global_int' +assign global_int_active = b2r.addr == 4112; + +//-----------------FIELD SUMMARY----------------- +// name : global_int (global_int[0:0]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'intr', 'stickybit', 'desc', 'enable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + global_int__global_int_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + global_int__global_int_q <= master_int_intr; + end +end // of global_int__global_int's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : global_halt (global_int[1:1]) +// access : hw = w +// sw = r (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'intr', 'stickybit', 'desc', 'haltenable', 'next'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + global_int__global_halt_q <= 0; +end +else +begin + begin + // Non-sticky interrupt. Only keep value high if source keeps up + global_int__global_halt_q <= master_halt_halt; + end +end // of global_int__global_halt's always_ff + + +/************************************** + * Register contains interrupts * + **************************************/ +// Register has at least one interrupt field +assign global_int_intr = |(global_int__global_int_q & global_int_en__global_int_en_q) || |(global_int__global_halt_q); + +// Register has at least one interrupt field with halt property set +assign global_int_halt = |(global_int__global_int_q) || |(global_int__global_halt_q & ~global_int_en__global_halt_en_q); + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign global_int_data_mux_in = {{30{1'b0}}, global_int__global_halt_q, global_int__global_int_q}; + +// Internal registers are ready immediately +assign global_int_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign global_int_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (1'b0))); + +/******************************************************************* +/******************************************************************* +/* REGISTER : global_int_en +/* DIMENSION : 0 +/* DEPTHS (per dimension): [] +/******************************************************************* +/*******************************************************************/ + +logic global_int_en_active ; +logic global_int_en_sw_wr ; +logic [31:0] global_int_en_data_mux_in ; +logic global_int_en_rdy_mux_in ; +logic global_int_en_err_mux_in ; +logic [0:0] global_int_en__global_int_en_q ; +logic [0:0] global_int_en__global_halt_en_q; + + +// Register-activation for 'global_int_en' +assign global_int_en_active = b2r.addr == 4116; +assign global_int_en_sw_wr = global_int_en_active && b2r.w_vld; + +//-----------------FIELD SUMMARY----------------- +// name : global_int_en (global_int_en[0:0]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + global_int_en__global_int_en_q <= 0; +end +else +begin + if (global_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + global_int_en__global_int_en_q[0:0] <= b2r.data[0:0]; + end +end // of global_int_en__global_int_en's always_ff + + + +//-----------------FIELD SUMMARY----------------- +// name : global_halt_en (global_int_en[1:1]) +// access : hw = na +// sw = rw (precedence) +// reset : active_low / asynchronous +// flags : ['sw', 'desc'] +// external : False +//----------------------------------------------- + +always_ff @(posedge clk or negedge field_reset_n) +if (!field_reset_n) +begin + global_int_en__global_halt_en_q <= 0; +end +else +begin + if (global_int_en_sw_wr) + begin + if (b2r.byte_en[0]) + global_int_en__global_halt_en_q[0:0] <= b2r.data[1:1]; + end +end // of global_int_en__global_halt_en's always_ff + + + + +/************************************** + * Assign all fields to signal to Mux * + **************************************/ +// Assign all fields. Fields that are not readable are tied to 0. +assign global_int_en_data_mux_in = {{30{1'b0}}, global_int_en__global_halt_en_q, global_int_en__global_int_en_q}; + +// Internal registers are ready immediately +assign global_int_en_rdy_mux_in = 1'b1; + +// Return an error if *no* read and *no* write was succesful. If some bits +// cannot be read/written but others are succesful, don't return and error +// Hence, as long as one action can be succesful, no error will be returned. +assign global_int_en_err_mux_in = !((b2r.r_vld && (b2r.byte_en[0])) || (b2r.w_vld && (b2r.byte_en[0]))); + +// Read multiplexer +always_comb +begin + unique case (1'b1) + block_a_int_active: + begin + r2b.data = block_a_int_data_mux_in; + r2b.err = block_a_int_err_mux_in; + r2b.rdy = block_a_int_rdy_mux_in; + end + block_a_int_en_active: + begin + r2b.data = block_a_int_en_data_mux_in; + r2b.err = block_a_int_en_err_mux_in; + r2b.rdy = block_a_int_en_rdy_mux_in; + end + block_a_halt_en_active: + begin + r2b.data = block_a_halt_en_data_mux_in; + r2b.err = block_a_halt_en_err_mux_in; + r2b.rdy = block_a_halt_en_rdy_mux_in; + end + block_b_int_active: + begin + r2b.data = block_b_int_data_mux_in; + r2b.err = block_b_int_err_mux_in; + r2b.rdy = block_b_int_rdy_mux_in; + end + block_b_int_en_active: + begin + r2b.data = block_b_int_en_data_mux_in; + r2b.err = block_b_int_en_err_mux_in; + r2b.rdy = block_b_int_en_rdy_mux_in; + end + block_b_halt_en_active: + begin + r2b.data = block_b_halt_en_data_mux_in; + r2b.err = block_b_halt_en_err_mux_in; + r2b.rdy = block_b_halt_en_rdy_mux_in; + end + block_c_int_active: + begin + r2b.data = block_c_int_data_mux_in; + r2b.err = block_c_int_err_mux_in; + r2b.rdy = block_c_int_rdy_mux_in; + end + block_c_int_en_active: + begin + r2b.data = block_c_int_en_data_mux_in; + r2b.err = block_c_int_en_err_mux_in; + r2b.rdy = block_c_int_en_rdy_mux_in; + end + block_c_halt_en_active: + begin + r2b.data = block_c_halt_en_data_mux_in; + r2b.err = block_c_halt_en_err_mux_in; + r2b.rdy = block_c_halt_en_rdy_mux_in; + end + block_d_int_active: + begin + r2b.data = block_d_int_data_mux_in; + r2b.err = block_d_int_err_mux_in; + r2b.rdy = block_d_int_rdy_mux_in; + end + block_d_int_en_active: + begin + r2b.data = block_d_int_en_data_mux_in; + r2b.err = block_d_int_en_err_mux_in; + r2b.rdy = block_d_int_en_rdy_mux_in; + end + block_d_halt_en_active: + begin + r2b.data = block_d_halt_en_data_mux_in; + r2b.err = block_d_halt_en_err_mux_in; + r2b.rdy = block_d_halt_en_rdy_mux_in; + end + master_int_active: + begin + r2b.data = master_int_data_mux_in; + r2b.err = master_int_err_mux_in; + r2b.rdy = master_int_rdy_mux_in; + end + master_halt_active: + begin + r2b.data = master_halt_data_mux_in; + r2b.err = master_halt_err_mux_in; + r2b.rdy = master_halt_rdy_mux_in; + end + master_int_en_active: + begin + r2b.data = master_int_en_data_mux_in; + r2b.err = master_int_en_err_mux_in; + r2b.rdy = master_int_en_rdy_mux_in; + end + master_halt_en_active: + begin + r2b.data = master_halt_en_data_mux_in; + r2b.err = master_halt_en_err_mux_in; + r2b.rdy = master_halt_en_rdy_mux_in; + end + global_int_active: + begin + r2b.data = global_int_data_mux_in; + r2b.err = global_int_err_mux_in; + r2b.rdy = global_int_rdy_mux_in; + end + global_int_en_active: + begin + r2b.data = global_int_en_data_mux_in; + r2b.err = global_int_en_err_mux_in; + r2b.rdy = global_int_en_rdy_mux_in; + end + default: + begin + // If the address is not found, return an error + r2b.data = 0; + r2b.err = 1; + r2b.rdy = b2r.r_vld || b2r.w_vld; + end + endcase +end +endmodule diff --git a/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_amba3ahblite.sv b/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_amba3ahblite.sv new file mode 100644 index 0000000..055df5f --- /dev/null +++ b/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_amba3ahblite.sv @@ -0,0 +1,314 @@ +/* + * Copyright 2021 Dennis Potter + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +module srdl2sv_amba3ahblite + import srdl2sv_if_pkg::*; +#( + parameter bit FLOP_REGISTER_IF = 0, + parameter BUS_BITS = 32, + parameter NO_BYTE_ENABLE = 0 +) +( + // Outputs to internal logic + output b2r_t b2r, + + // Inputs from internal logic + input r2b_t r2b, + + // Bus protocol + input HCLK, + input HRESETn, + input HSEL, + input [31:0] HADDR, + input HWRITE, + input [ 2:0] HSIZE, + input [ 3:0] HPROT, // Might be used in the future together with an RDL UDP + input [ 1:0] HTRANS, + input [BUS_BITS-1:0] HWDATA, + + output logic HREADYOUT, + output logic HRESP, + output logic [BUS_BITS-1:0] HRDATA +); + + localparam BUS_BYTES = BUS_BITS/8; + localparam BUS_BYTES_W = $clog2(BUS_BYTES); + + /*********************** + * Define enums + ***********************/ + typedef enum logic [2:0] { + SINGLE = 3'b000, + INCR = 3'b001, + WRAP4 = 3'b010, + INCR4 = 3'b011, + WRAP8 = 3'b100, + INCR8 = 3'b101, + WRAP16 = 3'b110, + INCR16 = 3'b111 + } HBURST_t; + + typedef enum logic [1:0] { + IDLE = 2'b00, + BUSY = 2'b01, + NONSEQ = 2'b10, + SEQ = 2'b11 + } HTRANS_t; + + typedef enum logic { + OKAY = 1'b0, + ERROR = 1'b1 + } HRESP_t; + + typedef enum logic { + READ = 1'b0, + WRITE = 1'b1 + } OP_t; + + typedef enum logic [1:0] { + FSM_IDLE = 2'b00, + FSM_TRANS = 2'b01, + FSM_ERR_0 = 2'b10, + FSM_ERR_1 = 2'b11 + } fsm_t; + + /**************************** + * Determine current address + ****************************/ + logic [31:0] HADDR_q; + logic [2:0] HSIZE_q; + OP_t operation_q; + + wire addr_err = HADDR % (32'b1 << HSIZE) != 32'b0; + + always_ff @ (posedge HCLK) + begin + case (HTRANS) + IDLE: ;// Do nothing + BUSY: ;// Do nothing + NONSEQ: + begin + // When a transfer is extended it has the side-effecxt + // of extending the address phase of the next transfer + if (HREADYOUT) + begin + HADDR_q <= HADDR; + HSIZE_q <= HSIZE; + operation_q <= HWRITE ? WRITE : READ; + end + end + SEQ: + begin + if (HREADYOUT) + begin + HADDR_q <= HADDR; + HSIZE_q <= HSIZE; + end + end + endcase + end + + /**************************** + * Statemachine + ****************************/ + logic [BUS_BITS-1:0] HRDATA_temp; + fsm_t fsm_next, fsm_q; + + always_comb + begin + // Defaults + HREADYOUT = 1'b1; + HRESP = 1'b0; + + // When reading back, the data of the bit that was accessed over the bus + // should be at byte 0 of the HRDATA bus and bits that were not accessed + // should be masked with 0s. + HRDATA_temp = r2b.data >> (8*HADDR_q[BUS_BYTES_W-1:0]); + + for (int i = 0; i < BUS_BYTES; i++) + if (i < (1 << HSIZE_q)) + HRDATA[8*(i+1)-1 -: 8] = HRDATA_temp[8*(i+1)-1 -: 8]; + else + HRDATA[8*(i+1)-1 -: 8] = 8'b0; + + b2r_w_vld_next = 0; + b2r_r_vld_next = 0; + fsm_next = fsm_q; + + case (fsm_q) + default: // FSM_IDLE + begin + if (HSEL && HTRANS > BUSY) + begin + if (addr_err) + // In case the address is illegal, switch to an error state + fsm_next = FSM_ERR_0; + else if (HTRANS == NONSEQ) + // If NONSEQ, go to NONSEQ state + fsm_next = FSM_TRANS; + else if (HTRANS == SEQ) + // If a SEQ is provided, something is wrong + fsm_next = FSM_ERR_0; + end + end + FSM_TRANS: + begin + HREADYOUT = r2b.rdy; + b2r_w_vld_next = operation_q == WRITE; + b2r_r_vld_next = operation_q == READ; + + if (r2b.err && r2b.rdy) + begin + fsm_next = FSM_ERR_0; + end + else if (HTRANS == BUSY) + begin + // Wait + fsm_next = FSM_TRANS; + end + else if (HTRANS == NONSEQ) + begin + // Another unrelated access is coming + fsm_next = FSM_TRANS; + end + else if (HTRANS == SEQ) + begin + // Another part of the burst is coming + fsm_next = FSM_TRANS; + end + else if (HTRANS == IDLE) + begin + // All done, wrapping things up! + fsm_next = r2b.rdy ? FSM_IDLE : FSM_TRANS; + end + end + FSM_ERR_0: + begin + HREADYOUT = 0; + + if (HTRANS == BUSY) + begin + // Slaves must always provide a zero wait state OKAY response + // to BUSY transfers and the transfer must be ignored by the slave. + HRESP = OKAY; + fsm_next = FSM_ERR_0; + end + else + begin + HRESP = ERROR; + fsm_next = FSM_ERR_1; + end + end + FSM_ERR_1: + begin + if (HTRANS == BUSY) + begin + // Slaves must always provide a zero wait state OKAY response + // to BUSY transfers and the transfer must be ignored by the slave. + HREADYOUT = 0; + HRESP = OKAY; + fsm_next = FSM_ERR_0; + end + else + begin + HREADYOUT = 1; + HRESP = ERROR; + + fsm_next = FSM_IDLE; + end + end + endcase + end + + + always_ff @ (posedge HCLK or negedge HRESETn) + if (!HRESETn) + fsm_q <= FSM_IDLE; + else + fsm_q <= fsm_next; + + /*** + * Determine the number of active bytes + ***/ + logic [BUS_BYTES-1:0] HSIZE_bitfielded; + logic [BUS_BYTES-1:0] b2r_byte_en_next; + logic b2r_w_vld_next; + logic b2r_r_vld_next; + + generate + if (NO_BYTE_ENABLE) + begin + assign b2r_byte_en_next = {BUS_BYTES{1'b1}}; + end + else + begin + always_comb + begin + for (int i = 0; i < BUS_BYTES; i++) + HSIZE_bitfielded[i] = i < (1 << HSIZE_q); + + // Shift if not the full bus is accessed + b2r_byte_en_next = HSIZE_bitfielded << (HADDR_q % BUS_BYTES); + end + end + endgenerate + + /*** + * Drive interface to registers + ***/ + generate + if (FLOP_REGISTER_IF) + begin + always_ff @ (posedge HCLK or negedge HRESETn) + if (!HRESETn) + begin + b2r.w_vld <= 1'b0; + b2r.r_vld <= 1'b0; + end + else + begin + b2r.w_vld <= b2r_w_vld_next; + b2r.r_vld <= b2r_r_vld_next; + end + + always_ff @ (posedge HCLK) + begin + b2r.addr <= {HADDR_q[31:BUS_BYTES_W], {BUS_BYTES_W{1'b0}}}; + b2r.data <= HWDATA << (8*HADDR_q[BUS_BYTES_W-1:0]); + b2r.byte_en <= b2r_byte_en_next; + end + end + else + begin + assign b2r.w_vld = b2r_w_vld_next; + assign b2r.r_vld = b2r_r_vld_next; + assign b2r.addr = {HADDR_q[31:BUS_BYTES_W], {BUS_BYTES_W{1'b0}}}; + assign b2r.data = HWDATA << (8*HADDR_q[BUS_BYTES_W-1:0]); + assign b2r.byte_en = b2r_byte_en_next; + end + endgenerate + +endmodule + diff --git a/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_if_pkg.sv b/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_if_pkg.sv new file mode 100644 index 0000000..f5434eb --- /dev/null +++ b/examples/interrupt_hierarchy/srdl2sv_out/srdl2sv_if_pkg.sv @@ -0,0 +1,18 @@ +package srdl2sv_if_pkg; + +typedef struct packed { // .Verilator does not support unpacked structs in packages + logic [31:0] addr; + logic [31:0] data; + logic w_vld; + logic r_vld; + logic [ 3:0] byte_en; +} b2r_t; + +typedef struct packed { // .Verilator does not support unpacked structs in packages + logic [31:0] data; + logic rdy; + logic err; +} r2b_t; + +endpackage +