diff --git a/register_file.sv b/register_file.sv index 19c4c362..d1d6bf77 100644 --- a/register_file.sv +++ b/register_file.sv @@ -35,20 +35,17 @@ module riscv_register_file localparam NUM_WORDS = 2**ADDR_WIDTH; - logic [DATA_WIDTH-1:0] MemContentxDP[NUM_WORDS]; + logic [DATA_WIDTH-1:0] mem[NUM_WORDS]; - logic [NUM_WORDS-1:1] WAddrOneHotxDa; - logic [NUM_WORDS-1:1] WAddrOneHotxDb; - logic [NUM_WORDS-1:1] WAddrOneHotxDb_reg; + logic [NUM_WORDS-1:1] waddr_onehot_a; + logic [NUM_WORDS-1:1] waddr_onehot_b, waddr_onehot_b_q; - logic [NUM_WORDS-1:1] ClocksxC; - logic [DATA_WIDTH-1:0] WDataIntxDa; - logic [DATA_WIDTH-1:0] WDataIntxDb; + logic [NUM_WORDS-1:1] mem_clocks; + logic [DATA_WIDTH-1:0] wdata_a_q; + logic [DATA_WIDTH-1:0] wdata_b_q; logic clk_int; - logic we_int; - int unsigned i; int unsigned j; int unsigned k; @@ -56,81 +53,85 @@ module riscv_register_file genvar x; genvar y; - assign we_int = we_a_i | we_b_i; - - cluster_clock_gating CG_WE_GLOBAL - ( - .clk_i ( clk ), - .en_i ( we_int ), - .test_en_i ( test_en_i ), - .clk_o ( clk_int ) - ); - //----------------------------------------------------------------------------- //-- READ : Read address decoder RAD //----------------------------------------------------------------------------- - assign rdata_a_o = MemContentxDP[raddr_a_i]; - assign rdata_b_o = MemContentxDP[raddr_b_i]; - assign rdata_c_o = MemContentxDP[raddr_c_i]; + assign rdata_a_o = mem[raddr_a_i]; + assign rdata_b_o = mem[raddr_b_i]; + assign rdata_c_o = mem[raddr_c_i]; + + + //----------------------------------------------------------------------------- + // WRITE : SAMPLE INPUT DATA + //--------------------------------------------------------------------------- + + cluster_clock_gating CG_WE_GLOBAL + ( + .clk_i ( clk ), + .en_i ( we_a_i | we_b_i ), + .test_en_i ( test_en_i ), + .clk_o ( clk_int ) + ); + + // use clk_int here, since otherwise we don't want to write anything anyway + always_ff @(posedge clk_int, negedge rst_n) + begin : sample_waddr + if (~rst_n) begin + wdata_a_q <= '0; + wdata_b_q <= '0; + waddr_onehot_b_q <= '0; + end else begin + if(we_a_i) + wdata_a_q <= wdata_a_i; + + if(we_b_i) + wdata_b_q <= wdata_b_i; + + waddr_onehot_b_q <= waddr_onehot_b; + end + end //----------------------------------------------------------------------------- //-- WRITE : Write Address Decoder (WAD), combinatorial process //----------------------------------------------------------------------------- - always_comb - begin : p_WADa - for(i=1; i