//+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