638 lines
24 KiB
Verilog
638 lines
24 KiB
Verilog
//+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
|