| |
| |
| module prim_subreg #( |
| parameter int DW = 32 , |
| parameter SWACCESS = "RW", // {RW, RO, WO, W1C, W1S, W0C, RC} |
| parameter logic [DW-1:0] RESVAL = '0 // Reset value |
| ) ( |
| input clk_i, |
| input rst_ni, |
| |
| // From SW: valid for RW, WO, W1C, W1S, W0C, RC |
| // In case of RC, Top connects Read Pulse to we |
| input we, |
| input [DW-1:0] wd, |
| |
| // From HW: valid for HRW, HWO |
| input de, |
| input [DW-1:0] d, |
| |
| // output to HW and Reg Read |
| output logic qe, |
| output logic [DW-1:0] q, |
| output logic [DW-1:0] qs |
| ); |
| |
| logic wr_en; |
| logic [DW-1:0] wr_data; |
| |
| prim_subreg_arb #( |
| .DW ( DW ), |
| .SWACCESS ( SWACCESS ) |
| ) wr_en_data_arb ( |
| .we, |
| .wd, |
| .de, |
| .d, |
| .q, |
| .wr_en, |
| .wr_data |
| ); |
| |
| always_ff @(posedge clk_i or negedge rst_ni) begin |
| if (!rst_ni) begin |
| qe <= 1'b0; |
| end else begin |
| qe <= we; |
| end |
| end |
| |
| always_ff @(posedge clk_i or negedge rst_ni) begin |
| if (!rst_ni) begin |
| q <= RESVAL; |
| end else if (wr_en) begin |
| q <= wr_data; |
| end |
| end |
| |
| assign qs = q; |
| |
| endmodule |