SPI_Test/rtl/system_regfile/system_regfile.v

638 lines
24 KiB
Coq
Raw Normal View History

2024-06-25 16:41:01 +08:00
//+FHDR--------------------------------------------------------------------------------------------------------
// Company:
//-----------------------------------------------------------------------------------------------------------------
// File Name : ssytem_regfile.v
// Department :
// Author : PWY
// Author's Tel :
//-----------------------------------------------------------------------------------------------------------------
// Relese History
// Version Date Author Description
// 1.0 2022-08-25 PWY
//-----------------------------------------------------------------------------------------------------------------
// Keywords :
//
//-----------------------------------------------------------------------------------------------------------------
// Parameter
//
//-----------------------------------------------------------------------------------------------------------------
// Purpose :
//
//-----------------------------------------------------------------------------------------------------------------
// Target Device:
// Tool versions:
//-----------------------------------------------------------------------------------------------------------------
// Reuse Issues
// Reset Strategy:
// Clock Domains:
// Critical Timing:
// Asynchronous I/F:
// Synthesizable (y/n):
// Other:
//-FHDR--------------------------------------------------------------------------------------------------------
// -----------------------------------------------------------
// -- Register address offset macros
// -----------------------------------------------------------
//Identity Register
`define IDR 16'h00
//Vendor Code Register
`define VIDR 16'h04
//RTL Freeze Date Register
`define DATER 16'h08
//Version Register
`define VERR 16'h0C
//Wirte And Read Test Register
`define TESTR 16'h10
//Interrupt Mask Register
//[31:29] --> Reserved
//[28 ] --> DBG UPD Interrupt Mask
//[27 ] --> CH3 AWG Conflict nterrupt Mask
//[26 ] --> CH3 LDST ADDR UNALGN Interrupt Mask
//[25 ] --> CH3 DEC ERR Interrupt Mask
//[24 ] --> CH3 EXITI Interrupt Mask
//[23:20] --> Reserved
//[19 ] --> CH2 AWG Conflict nterrupt Mask
//[18 ] --> CH2 LDST ADDR UNALGN Interrupt Mask
//[17 ] --> CH2 DEC ERR Interrupt Mask
//[16 ] --> CH2 EXITI Interrupt Mask
//[15:12] --> Reserved
//[11 ] --> CH1 AWG Conflict nterrupt Mask
//[10 ] --> CH1 LDST ADDR UNALGN Interrupt Mask
//[9 ] --> CH1 DEC ERR Interrupt Mask
//[8 ] --> CH1 EXITI Interrupt Mask
//[7 :4] --> Reserved
//[3 ] --> CH1 AWG Conflict nterrupt Mask
//[2 ] --> CH1 LDST ADDR UNALGN Interrupt Mask
//[1 ] --> CH1 DEC ERR Interrupt Mask
//[0 ] --> CH1 EXITI Interrupt Mask
`define IMR 16'h14
//[31:29] --> Reserved
//[28 ] --> DBG UPD Interrupt Status
//[27 ] --> CH3 AWG Conflict nterrupt Status
//[26 ] --> CH3 LDST ADDR UNALGN Interrupt Status
//[25 ] --> CH3 DEC ERR Interrupt Status
//[24 ] --> CH3 EXITI Interrupt Status
//[23:20] --> Reserved
//[19 ] --> CH2 AWG Conflict Status
//[18 ] --> CH2 LDST ADDR UNALGN Interrupt Status
//[17 ] --> CH2 DEC ERR Interrupt Status
//[16 ] --> CH2 EXITI Interrupt Status
//[15:12] --> Reserved
//[11 ] --> CH1 AWG Conflict nterrupt Status
//[10 ] --> CH1 LDST ADDR UNALGN Interrupt Status
//[9 ] --> CH1 DEC ERR Interrupt Status
//[8 ] --> CH1 EXITI Interrupt Status
//[7 :4] --> Reserved
//[3 ] --> CH1 AWG Conflict nterrupt Status
//[2 ] --> CH1 LDST ADDR UNALGN Interrupt Status
//[1 ] --> CH1 DEC ERR Interrupt Status
//[0 ] --> CH1 EXITI Interrupt Status
`define ISR 16'h18
//Soft Reset Time Register
`define SFRTR 16'h1C
//Soft Reset Register
`define SFRR 16'h20
//CH0 Soft Reset Register
`define CH0RSTR 16'h24
//CH1Soft Reset Register
`define CH1RSTR 16'h28
//CH2 Soft Reset Register
`define CH2RSTR 16'h2C
//CH3 Soft Reset Register
`define CH3RSTR 16'h30
//Debug config Register
`define DBGCFGR 16'h34
//Post Masking Interrupt Status Register
//Interrupt Status Register
//[31:29] --> Reserved
//[28 ] --> DBG UPD Interrupt Status
//[27 ] --> CH3 AWG Conflict nterrupt Status
//[26 ] --> CH3 LDST ADDR UNALGN Masking Interrupt Status
//[25 ] --> CH3 DEC ERR Masking Interrupt Status
//[24 ] --> CH3 EXITI Masking Interrupt Status
//[23:20] --> Reserved
//[19 ] --> CH2 AWG Conflict Status
//[18 ] --> CH2 LDST ADDR UNALGN Masking Interrupt Status
//[17 ] --> CH2 DEC ERR Masking Interrupt Status
//[16 ] --> CH2 EXITI Masking Interrupt Status
//[15:12] --> Reserved
//[11 ] --> CH1 AWG Conflict nterrupt Status
//[10 ] --> CH1 LDST ADDR UNALGN Masking Interrupt Status
//[9 ] --> CH1 DEC ERR Masking Interrupt Status
//[8 ] --> CH1 EXITI Masking Interrupt Status
//[7 :4] --> Reserved
//[3 ] --> CH1 AWG Conflict nterrupt Status
//[2 ] --> CH1 LDST ADDR UNALGN Masking Interrupt Status
//[1 ] --> CH1 DEC ERR Masking Interrupt Status
//[0 ] --> CH1 EXITI Masking Interrupt Status
`define MISR 16'h40
module system_regfile (
//system port
input clk // System Main Clock
,input rst_n // Spi Reset active low
//rw op port
,input [31 :0] wrdata // write data
,input wren // write enable
,input [15 :0] rwaddr // read & write address
,input rden // read enable
,output [31 :0] rddata // read data
//debug cfg port
,output dbg_enable //active high
,output dbg_data_sel //1'b0-->mod;1'b1-->dsp
,output [3 :0] dbg_ch_sel //4'b0001-->ch0;4'b0010-->ch1;
//4'b0100-->ch2;4'b1000-->ch3;
//debug status Port
,input dbg_upd
//ch0 status Port
,input ch0_proc_cft
,input ch0_ldst_addr_unalgn
,input ch0_dec_err
,input ch0_exit_irq
//ch1 status Port
,input ch1_proc_cft
,input ch1_ldst_addr_unalgn
,input ch1_dec_err
,input ch1_exit_irq
//ch2 status Port
,input ch2_proc_cft
,input ch2_ldst_addr_unalgn
,input ch2_dec_err
,input ch2_exit_irq
//ch3 status Port
,input ch3_proc_cft
,input ch3_ldst_addr_unalgn
,input ch3_dec_err
,input ch3_exit_irq
//Soft Reset out
,output sys_soft_rstn
,output ch0_soft_rstn
,output ch1_soft_rstn
,output ch2_soft_rstn
,output ch3_soft_rstn
//Interrupt output port
,output irq
);
localparam L = 1'b0,
H = 1'b1;
localparam IDRD = 32'h41574743;
localparam VIDRD = 32'h55535443;
localparam DATERD = 32'h20220831;
localparam VERSION = 32'h00000001;
localparam TESTRD = 32'h01234567;
// ------------------------------------------------------
// -- Register enable (select) wires
// ------------------------------------------------------
wire idren; // idr select
wire vidren; // vidr select
wire dateren; // dater select
wire verren; // dater select
wire testren; // testr select
wire imren; // imr select
wire isren; // isr select
wire misren; // imsr select
wire sfrtren; // sfrtr select
wire sfrren; // sfrr select
wire ch0rstren; // mcurstr select
wire ch1rstren; // awgrstr select
wire ch2rstren; // adacrstr select
wire ch3rstren; // adacrstr select
wire dbgcfgren; // adacrstr select
// ------------------------------------------------------
// -- Register write enable wires
// ------------------------------------------------------
wire testrwe; // testr write enable
wire imrwe; // imr write enable
wire misrwe; // imsr write enable
wire sfrtrwe; // sfrtr write enable
wire sfrrwe; // sfrr write enable
wire ch0rstrwe; // mcurstr select
wire ch1rstrwe; // awgrstr select
wire ch2rstrwe; // adacrstr select
wire ch3rstrwe; // adacrstr select
wire dbgcfgrwe; // adacrstr write enable
// ------------------------------------------------------
// -- Misc wires
// ------------------------------------------------------
wire [31 :0] irisr ; // original interrupt status wire
wire icr ; // interrupt status clear wire
// ------------------------------------------------------
// -- Misc Registers
// ------------------------------------------------------
wire [31 :0] testr ;
wire [31 :0] imr ;
wire [31 :0] isr ;
wire [31 :0] misr ;
wire [31 :0] sfrtr ;
wire [0 :0] sfrr ;
wire [0 :0] ch0rstr ;
wire [0 :0] ch1rstr ;
wire [0 :0] ch2rstr ;
wire [0 :0] ch3rstr ;
wire [5 :0] dbgcfgr ;
reg [31 :0] rddata_reg ;
wire dbg_upd_r ;
//ch0 status reg
wire ch0_proc_cft_r ;
wire ch0_ldst_addr_unalgn_r ;
wire ch0_dec_err_r ;
wire ch0_exit_irq_r ;
//ch1 status reg
wire ch1_proc_cft_r ;
wire ch1_dbg_fifo_f_r ;
wire ch1_ldst_addr_unalgn_r ;
wire ch1_dec_err_r ;
wire ch1_exit_irq_r ;
//ch2 status reg
wire ch2_proc_cft_r ;
wire ch2_ldst_addr_unalgn_r ;
wire ch2_dec_err_r ;
wire ch2_exit_irq_r ;
//ch3 status reg
wire ch3_proc_cft_r ;
wire ch3_ldst_addr_unalgn_r ;
wire ch3_dec_err_r ;
wire ch3_exit_irq_r ;
wire sys_soft_rstn_r ;
wire ch0_soft_rstn_r ;
wire ch1_soft_rstn_r ;
wire ch2_soft_rstn_r ;
wire ch3_soft_rstn_r ;
// ------------------------------------------------------
// -- Address decoder
//
// Decodes the register address offset input(reg_addr)
// to produce enable (select) signals for each of the
// SW-registers in the macrocell. The reg_addr input
// is bits [8:0] of the paddr bus.
// ------------------------------------------------------
assign idren = (rwaddr[15:2] == `IDR >> 2) ? 1'b1 : 1'b0;
assign vidren = (rwaddr[15:2] == `VIDR >> 2) ? 1'b1 : 1'b0;
assign dateren = (rwaddr[15:2] == `DATER >> 2) ? 1'b1 : 1'b0;
assign verren = (rwaddr[15:2] == `VERR >> 2) ? 1'b1 : 1'b0;
assign testren = (rwaddr[15:2] == `TESTR >> 2) ? 1'b1 : 1'b0;
assign imren = (rwaddr[15:2] == `IMR >> 2) ? 1'b1 : 1'b0;
assign isren = (rwaddr[15:2] == `ISR >> 2) ? 1'b1 : 1'b0;
assign misren = (rwaddr[15:2] == `MISR >> 2) ? 1'b1 : 1'b0;
assign sfrtren = (rwaddr[15:2] == `SFRTR >> 2) ? 1'b1 : 1'b0;
assign sfrren = (rwaddr[15:2] == `SFRR >> 2) ? 1'b1 : 1'b0;
assign ch0rstren = (rwaddr[15:2] == `CH0RSTR >> 2) ? 1'b1 : 1'b0;
assign ch1rstren = (rwaddr[15:2] == `CH1RSTR >> 2) ? 1'b1 : 1'b0;
assign ch2rstren = (rwaddr[15:2] == `CH2RSTR >> 2) ? 1'b1 : 1'b0;
assign ch3rstren = (rwaddr[15:2] == `CH3RSTR >> 2) ? 1'b1 : 1'b0;
assign dbgcfgren = (rwaddr[15:2] == `DBGCFGR >> 2) ? 1'b1 : 1'b0;
// ------------------------------------------------------
// -- Write enable signals
//
// Write enable signals for writable SW-registers.
// The write enable for each register is the ANDed
// result of the register enable and the input reg_wren
// ------------------------------------------------------
assign testrwe = testren & wren;
assign imrwe = imren & wren;
assign sfrtrwe = sfrtren & wren;
assign sfrrwe = sfrren & wren;
assign ch0rstrwe = ch0rstren & wren;
assign ch1rstrwe = ch1rstren & wren;
assign ch2rstrwe = ch2rstren & wren;
assign ch3rstrwe = ch3rstren & wren;
assign dbgcfgrwe = dbgcfgren & wren;
// ---------------------------------------------------------------------------------------------------
// -- interrupt Mask Register
//
// Write interrupt Mask for 'imr' : 12-bit register
// Register is split into the following bit fields
//
//Interrupt Mask Register
//[31:29] --> Reserved
//[28 ] --> DBG UPD Interrupt Mask
//[27 ] --> CH3 AWG Conflict nterrupt Mask
//[26 ] --> CH3 LDST ADDR UNALGN Interrupt Mask
//[25 ] --> CH3 DEC ERR Interrupt Mask
//[24 ] --> CH3 EXITI Interrupt Mask
//[23:20] --> Reserved
//[19 ] --> CH2 AWG Conflict nterrupt Mask
//[18 ] --> CH2 LDST ADDR UNALGN Interrupt Mask
//[17 ] --> CH2 DEC ERR Interrupt Mask
//[16 ] --> CH2 EXITI Interrupt Mask
//[15:12] --> Reserved
//[11 ] --> CH1 AWG Conflict nterrupt Mask
//[10 ] --> CH1 LDST ADDR UNALGN Interrupt Mask
//[9 ] --> CH1 DEC ERR Interrupt Mask
//[8 ] --> CH1 EXITI Interrupt Mask
//[7 :4] --> Reserved
//[3 ] --> CH1 AWG Conflict nterrupt Mask
//[2 ] --> CH1 LDST ADDR UNALGN Interrupt Mask
//[1 ] --> CH1 DEC ERR Interrupt Mask
//[0 ] --> CH1 EXITI Interrupt Mask
// ---------------------------------------------------------------------------------------------------
sirv_gnrl_dfflr #(32) imr_dfflr (imrwe, wrdata[31:0], imr, clk, rst_n);
// ------------------------------------------------------
// -- testr Register
//
// Write testr for 'TESTR' : 32-bit register
// Register is split into the following bit fields
//
// [31:0] --> testr
// ------------------------------------------------------
sirv_gnrl_dfflrd #(32) testr_dfflrd (TESTRD, testrwe, wrdata[31:0], testr, clk, rst_n);
// ------------------------------------------------------
// -- Soft Reset Count Register
//
// Write Soft Reset Count for 'sfrtcr' : 6-bit register
// Register is split into the following bit fields
//
// [31:0] --> sfrtcr,default value 32'd300
// ------------------------------------------------------
sirv_gnrl_dfflrd #(32) sfrtr_dfflrd (32'd300, sfrtrwe, wrdata[31:0], sfrtr, clk, rst_n);/////////////////////////////sfrtcr-->sfrtr
// ------------------------------------------------------
// -- debug config Register
//
//
// [3:0] --> dbgcfgr,default value 4'b0000
// ------------------------------------------------------
sirv_gnrl_dfflr #(6) dbgcfgr_dfflr (dbgcfgrwe, wrdata[5:0], dbgcfgr, clk, rst_n);
// ------------------------------------------------------
// -- soft reset count
// ------------------------------------------------------
wire [31:0] cnt_c;
wire add_cnt = (sys_soft_rstn_r == L)
| (ch0_soft_rstn_r == L)
| (ch1_soft_rstn_r == L)
| (ch2_soft_rstn_r == L)
| (ch3_soft_rstn_r == L);
wire end_cnt = add_cnt & (cnt_c == sfrtr-1);
wire [31:0] cnt_n = end_cnt ? 32'h0 :
add_cnt ? cnt_c + 1'b1 :
cnt_c ;
sirv_gnrl_dffr #(32) cnt_c_dffr (cnt_n, cnt_c, clk, rst_n);
// ------------------------------------------------------
// -- Soft Reset Register
//
// Write Soft Reset for 'sfrtr' : 1-bit register
// Register is split into the following bit fields
//
// [16'h0024] --> System Soft Reset ,low active
// [16'h0028] --> MCU Soft Reset ,low active
// [16'h002C] --> AWG Soft Reset ,low active
// [16'h0030] --> DAC Soft Reset ,low active
// ------------------------------------------------------
//sys_soft_rstn_r
wire sys_soft_rstn_en = end_cnt | sfrrwe;
wire sys_soft_rstn_w = end_cnt ? 1'b1 :
sfrrwe ? 1'b0 :
1'b1 ;
sirv_gnrl_dfflrs #(1) sys_soft_rstn_r_dffls (sys_soft_rstn_en, sys_soft_rstn_w, sys_soft_rstn_r, clk, rst_n);
//ch0_soft_rstn_r
wire ch0_soft_rstn_en = end_cnt | ch0rstrwe;
wire ch0_soft_rstn_r_w = end_cnt ? 1'b1 :
ch0rstrwe ? 1'b0 :
1'b1 ;
sirv_gnrl_dfflrs #(1) ch0_soft_rstn_r_dffls (ch0_soft_rstn_en, ch0_soft_rstn_r_w, ch0_soft_rstn_r, clk, rst_n);
//ch1_soft_rstn_r
wire ch1_soft_rstn_en = end_cnt | ch1rstrwe;
wire ch1_soft_rstn_w = end_cnt ? 1'b1 :
ch1rstrwe ? 1'b0 :
1'b1 ;
sirv_gnrl_dfflrs #(1) ch1_soft_rstn_r_dffls (ch1_soft_rstn_en, ch1_soft_rstn_w, ch1_soft_rstn_r, clk, rst_n);
//ch2_soft_rstn_r
wire ch2_soft_rstn_en = end_cnt | ch2rstrwe;
wire ch2_soft_rstn_w = end_cnt ? 1'b1 :
ch2rstrwe ? 1'b0 :
1'b1 ;
sirv_gnrl_dfflrs #(1) ch2_soft_rstn_r_dffls (ch2_soft_rstn_en, ch2_soft_rstn_w, ch2_soft_rstn_r, clk, rst_n);
//ch3_soft_rstn_r
wire ch3_soft_rstn_en = end_cnt | ch3rstrwe;
wire ch3_soft_rstn_w = end_cnt ? 1'b1 :
ch3rstrwe ? 1'b0 :
1'b1 ;
sirv_gnrl_dfflrs #(1) ch3_soft_rstn_r_dffls (ch3_soft_rstn_en, ch3_soft_rstn_w, ch3_soft_rstn_r, clk, rst_n);
assign sys_soft_rstn = sys_soft_rstn_r;
assign ch0_soft_rstn = ch0_soft_rstn_r;
assign ch1_soft_rstn = ch1_soft_rstn_r;
assign ch2_soft_rstn = ch2_soft_rstn_r;
assign ch3_soft_rstn = ch3_soft_rstn_r;
// ------------------------------------------------------
// -- Read data mux
//
// -- The data from the selected register is
// -- placed on a zero-padded 32-bit read data bus.
// ------------------------------------------------------
always @(*) begin : RDDATA_PROC
rddata_reg = {32{1'b0}};
if(idren == H ) rddata_reg[31:0] = IDRD;
if(vidren == H ) rddata_reg[31:0] = VIDRD;
if(dateren == H ) rddata_reg[31:0] = DATERD;
if(verren == H ) rddata_reg[31:0] = VERSION;
if(testren == H ) rddata_reg[31:0] = testr;
if(imren == H ) rddata_reg[31:0] = imr;
if(isren == H ) rddata_reg[31:0] = isr;
if(misren == H ) rddata_reg[31:0] = misr;
if(sfrtren == H ) rddata_reg[31:0] = sfrtr;
if(dbgcfgren == H ) rddata_reg[5 :0] = dbgcfgr;
end
//rddata
sirv_gnrl_dffr #(32) rddata_dffr (rddata_reg, rddata, clk, rst_n);
// ------------------------------------------------------
// -- interrupt status
// ------------------------------------------------------
//read misr clear interrupts
assign icr = (misren) && rden;
//dbg_upd_r
wire dbg_upd_en = icr | dbg_upd;
wire dbg_upd_w = ~icr | dbg_upd;
sirv_gnrl_dfflr #(1) dbg_upd_r_dfflr (dbg_upd_en, dbg_upd_w, dbg_upd_r, clk, rst_n);
//ch0_proc_cft_r
wire ch0_proc_cft_en = icr | ch0_proc_cft;
wire ch0_proc_cft_w = ~icr | ch0_proc_cft;
sirv_gnrl_dfflr #(1) ch0_proc_cft_r_dfflr (ch0_proc_cft_en, ch0_proc_cft_w, ch0_proc_cft_r, clk, rst_n);
//ch0_ldst_addr_unalgn_r
wire ch0_ldst_addr_unalgn_en = icr | ch0_ldst_addr_unalgn;
wire ch0_ldst_addr_unalgn_w = ~icr | ch0_ldst_addr_unalgn;
sirv_gnrl_dfflr #(1) ch0_ldst_addr_unalgn_r_dfflr (ch0_ldst_addr_unalgn_en, ch0_ldst_addr_unalgn_w, ch0_ldst_addr_unalgn_r, clk, rst_n);
//ch0_dec_err_r
wire ch0_dec_err_en = icr | ch0_dec_err;
wire ch0_dec_err_w = ~icr | ch0_dec_err;
sirv_gnrl_dfflr #(1) ch0_dec_err_r_dfflr (ch0_dec_err_en, ch0_dec_err_w, ch0_dec_err_r, clk, rst_n);
//ch0_exit_irq_r
wire ch0_exit_irq_en = icr | ch0_exit_irq;
wire ch0_exit_irq_w = ~icr | ch0_exit_irq;
sirv_gnrl_dfflr #(1) ch0_exit_irq_r_dfflr (ch0_exit_irq_en, ch0_exit_irq_w, ch0_exit_irq_r, clk, rst_n);
//ch1_proc_cft_r
wire ch1_proc_cft_en = icr | ch1_proc_cft;
wire ch1_proc_cft_w = ~icr | ch1_proc_cft;
sirv_gnrl_dfflr #(1) ch1_proc_cft_r_dfflr (ch1_proc_cft_en, ch1_proc_cft_w, ch1_proc_cft_r, clk, rst_n);
//ch1_ldst_addr_unalgn_r
wire ch1_ldst_addr_unalgn_en = icr | ch1_ldst_addr_unalgn;
wire ch1_ldst_addr_unalgn_w = ~icr | ch1_ldst_addr_unalgn;
sirv_gnrl_dfflr #(1) ch1_ldst_addr_unalgn_r_dfflr (ch1_ldst_addr_unalgn_en, ch1_ldst_addr_unalgn_w, ch1_ldst_addr_unalgn_r, clk, rst_n);
//ch1_dec_err_r
wire ch1_dec_err_en = icr | ch1_dec_err;
wire ch1_dec_err_w = ~icr | ch1_dec_err;
sirv_gnrl_dfflr #(1) ch1_dec_err_r_dfflr (ch1_dec_err_en, ch1_dec_err_w, ch1_dec_err_r, clk, rst_n);
//ch1_exit_irq_r
wire ch1_exit_irq_en = icr | ch1_exit_irq;
wire ch1_exit_irq_w = ~icr | ch1_exit_irq;
sirv_gnrl_dfflr #(1) ch1_exit_irq_r_dfflr (ch1_exit_irq_en, ch1_exit_irq_w, ch1_exit_irq_r, clk, rst_n);
//ch2_proc_cft_r
wire ch2_proc_cft_en = icr | ch2_proc_cft;
wire ch2_proc_cft_w = ~icr | ch2_proc_cft;
sirv_gnrl_dfflr #(1) ch2_proc_cft_r_dfflr (ch2_proc_cft_en, ch2_proc_cft_w, ch2_proc_cft_r, clk, rst_n);
//ch2_ldst_addr_unalgn_r
wire ch2_ldst_addr_unalgn_en = icr | ch2_ldst_addr_unalgn;
wire ch2_ldst_addr_unalgn_w = ~icr | ch2_ldst_addr_unalgn;
sirv_gnrl_dfflr #(1) ch2_ldst_addr_unalgn_r_dfflr (ch2_ldst_addr_unalgn_en, ch2_ldst_addr_unalgn_w, ch2_ldst_addr_unalgn_r, clk, rst_n);
//ch2_dec_err_r
wire ch2_dec_err_en = icr | ch2_dec_err;
wire ch2_dec_err_w = ~icr | ch2_dec_err;
sirv_gnrl_dfflr #(1) ch2_dec_err_r_dfflr (ch2_dec_err_en, ch2_dec_err_w, ch2_dec_err_r, clk, rst_n);
//ch2_exit_irq_r
wire ch2_exit_irq_en = icr | ch2_exit_irq;
wire ch2_exit_irq_w = ~icr | ch2_exit_irq;
sirv_gnrl_dfflr #(1) ch2_exit_irq_r_dfflr (ch2_exit_irq_en, ch2_exit_irq_w, ch2_exit_irq_r, clk, rst_n);
//ch3_proc_cft_r
wire ch3_proc_cft_en = icr | ch3_proc_cft;
wire ch3_proc_cft_w = ~icr | ch3_proc_cft;
sirv_gnrl_dfflr #(1) ch3_proc_cft_r_dfflr (ch3_proc_cft_en, ch3_proc_cft_w, ch3_proc_cft_r, clk, rst_n);
//ch3_ldst_addr_unalgn_r
wire ch3_ldst_addr_unalgn_en = icr | ch3_ldst_addr_unalgn;
wire ch3_ldst_addr_unalgn_w = ~icr | ch3_ldst_addr_unalgn;
sirv_gnrl_dfflr #(1) ch3_ldst_addr_unalgn_r_dfflr (ch3_ldst_addr_unalgn_en, ch3_ldst_addr_unalgn_w, ch3_ldst_addr_unalgn_r, clk, rst_n);
//ch3_dec_err_r
wire ch3_dec_err_en = icr | ch3_dec_err;
wire ch3_dec_err_w = ~icr | ch3_dec_err;
sirv_gnrl_dfflr #(1) ch3_dec_err_r_dfflr (ch3_dec_err_en, ch3_dec_err_w, ch3_dec_err_r, clk, rst_n);
//ch3_exit_irq_r
wire ch3_exit_irq_en = icr | ch3_exit_irq;
wire ch3_exit_irq_w = ~icr | ch3_exit_irq;
sirv_gnrl_dfflr #(1) ch3_exit_irq_r_dfflr (ch3_exit_irq_en, ch3_exit_irq_w, ch3_exit_irq_r, clk, rst_n);
//irisr
assign irisr[31] = L ;
assign irisr[30] = L ;
assign irisr[29] = L ;
assign irisr[28] = dbg_upd_r ;
assign irisr[27] = ch3_proc_cft_r ;
assign irisr[26] = ch3_ldst_addr_unalgn_r ;
assign irisr[25] = ch3_dec_err_r ;
assign irisr[24] = ch3_exit_irq_r ;
assign irisr[23] = L ;
assign irisr[22] = L ;
assign irisr[21] = L ;
assign irisr[20] = L ;
assign irisr[19] = ch2_proc_cft_r ;
assign irisr[18] = ch2_ldst_addr_unalgn_r ;
assign irisr[17] = ch2_dec_err_r ;
assign irisr[16] = ch2_exit_irq_r ;
assign irisr[15] = L ;
assign irisr[14] = L ;
assign irisr[13] = L ;
assign irisr[12] = L ;
assign irisr[11] = ch1_proc_cft_r ;
assign irisr[10] = ch1_ldst_addr_unalgn_r ;
assign irisr[9 ] = ch1_dec_err_r ;
assign irisr[8 ] = ch1_exit_irq_r ;
assign irisr[7 ] = L ;
assign irisr[6 ] = L ;
assign irisr[5 ] = L ;
assign irisr[4 ] = L ;
assign irisr[3 ] = ch0_proc_cft_r ;
assign irisr[2 ] = ch0_ldst_addr_unalgn_r ;
assign irisr[1 ] = ch0_dec_err_r ;
assign irisr[0 ] = ch0_exit_irq_r ;
// ------------------------------------------------------
// -- Interrupt Status Register - Read Only
//
// This register contains the status of all
// XYZ Chip interrupts after masking.
// ------------------------------------------------------
sirv_gnrl_dffr #(32) isr_dffr (irisr, isr, clk, rst_n);
//misr
wire[31:0] misr_w = imr & irisr;
sirv_gnrl_dffr #(32) misr_dffr (misr_w, misr, clk, rst_n);
//irq
wire irq_w = |misr;
sirv_gnrl_dffr #(1) irq_dffr (irq_w, irq, clk, rst_n);
//debug cfg
assign dbg_enable = dbgcfgr[0];
assign dbg_data_sel = dbgcfgr[1];
assign dbg_ch_sel = dbgcfgr[5:2];
endmodule
`undef IDR
`undef VIDR
`undef DATER
`undef VERR
`undef TESTR
`undef IMR
`undef ISR
`undef MISR
`undef SFRTR
`undef SFRR
`undef CH0RSTR
`undef CH1RSTR
`undef CH2RSTR
`undef CH3RSTR
`undef DBGCFGR