merge derek change in vrf and update tb

Change-Id: If2a1603483047547f1941d5dcdf29025ca48073f
diff --git a/hdl/verilog/rvv/design/rvv_backend_vrf.sv b/hdl/verilog/rvv/design/rvv_backend_vrf.sv
index ba4d6a2..3f99563 100755
--- a/hdl/verilog/rvv/design/rvv_backend_vrf.sv
+++ b/hdl/verilog/rvv/design/rvv_backend_vrf.sv
@@ -42,9 +42,9 @@
 logic [`NUM_RT_UOP-1:0][`VLEN-1:0]                wr_data;
 logic [`NUM_RT_UOP-1:0][`VLENB-1:0]               wr_we;              // byte enable
 logic [`NUM_RT_UOP-1:0][`VLEN-1:0]                wr_web;             // bit enable
-logic [`NUM_RT_UOP-1:0][`NUM_VRF-1:0][`VLEN-1:0]  vrf_wr_wenb;
+logic [`NUM_RT_UOP-1:0][`NUM_VRF-1:0][`VLENB-1:0] vrf_wr_wen;
 logic [`NUM_RT_UOP-1:0][`NUM_VRF-1:0][`VLEN-1:0]  vrf_wr_data;
-logic [`NUM_VRF-1:0][`VLEN-1:0]                   vrf_wr_wenb_full;
+logic [`NUM_VRF-1:0][`VLENB-1:0]                  vrf_wr_wen_full;
 logic [`NUM_VRF-1:0][`VLEN-1:0]                   vrf_wr_data_full;
 logic [`NUM_DP_VRF-1:0][`REGFILE_INDEX_WIDTH-1:0] rd_addr;
 logic [`NUM_VRF-1:0][`VLEN-1:0]                   vrf_rd_data_full;   // full 32 VLEN data from VRF
@@ -64,11 +64,11 @@
 
     // access VRF. Only write will update input
     always_comb begin
-      vrf_wr_wenb[j] = 'b0;
+      vrf_wr_wen[j]  = 'b0;
       vrf_wr_data[j] = 'b0;
 
       if(wr_valid[j]) begin
-        vrf_wr_wenb[j][wr_addr[j]] = wr_web[j];
+        vrf_wr_wen[j][wr_addr[j]] = wr_we[j];
         vrf_wr_data[j][wr_addr[j]] = wr_data[j]&wr_web[j];
       end
     end
@@ -77,12 +77,12 @@
 
 // merge all retire data
 always_comb begin
-  vrf_wr_wenb_full = 'b0;
+  vrf_wr_wen_full = 'b0;
   vrf_wr_data_full = 'b0;
 
   for(int i=0; i<`NUM_VRF; i++) begin
     for(int h=0; h<`NUM_RT_UOP; h++) begin
-      vrf_wr_wenb_full[i] = vrf_wr_wenb_full[i] | vrf_wr_wenb[h][i];
+      vrf_wr_wen_full[i] = vrf_wr_wen_full[i] | vrf_wr_wen[h][i];
       vrf_wr_data_full[i] = vrf_wr_data_full[i] | vrf_wr_data[h][i];
     end
   end
@@ -96,7 +96,7 @@
   //Inputs
   .clk    (clk), 
   .rst_n  (rst_n),
-  .wenb   (vrf_wr_wenb_full),
+  .wen    (vrf_wr_wen_full),
   .wdata  (vrf_wr_data_full)
 );
 
diff --git a/hdl/verilog/rvv/design/rvv_backend_vrf_reg.sv b/hdl/verilog/rvv/design/rvv_backend_vrf_reg.sv
index 1bcc96d..604fa98 100644
--- a/hdl/verilog/rvv/design/rvv_backend_vrf_reg.sv
+++ b/hdl/verilog/rvv/design/rvv_backend_vrf_reg.sv
@@ -9,12 +9,12 @@
    // Outputs
    vreg,
    // Inputs
-   wenb, wdata, clk, rst_n
+   wen, wdata, clk, rst_n
    );
 
   output logic [`NUM_VRF-1:0][`VLEN-1:0]  vreg;
 
-  input  logic [`NUM_VRF-1:0][`VLEN-1:0]  wenb; // bit en
+  input  logic [`NUM_VRF-1:0][`VLENB-1:0] wen; // byte enable
   input  logic [`NUM_VRF-1:0][`VLEN-1:0]  wdata;
   input  logic                            clk;
   input  logic                            rst_n;
@@ -23,17 +23,20 @@
 genvar i,j;
 generate
   for (i=0; i<`NUM_VRF; i=i+1) begin
-    for (j=0; j<`VLEN; j=j+1) begin
-      edff vrf_unit1_reg (
-        .q      (vreg[i][j]),
-        .e      (wenb[i][j]),
-        .d      (wdata[i][j]),
+    for (j=0; j<`VLENB; j=j+1) begin
+      edff #(
+        .T      (logic [`BYTE_WIDTH-1:0])
+      )
+      vrf_unit1_reg (
+        .q      (vreg[i][j*`BYTE_WIDTH +: `BYTE_WIDTH]),
+        .e      (wen[i][j]),
+        .d      (wdata[i][j*`BYTE_WIDTH +: `BYTE_WIDTH]),
         .clk    (clk),
         .rst_n  (rst_n)
         );
     `ifdef ASSERT_ON
-      `rvv_forbid($isunknown(vreg[i][j]))
-        else $error("VREG: data is unknow at vreg[%0d][%0d]",i,j);
+      `rvv_forbid($isunknown(vreg[i][j*`BYTE_WIDTH +: `BYTE_WIDTH]))
+        else $error("VREG: data is unknow at vreg[%0d][%0d:%0d]",i,8*j+7,8*j);
     `endif //ASSERT_ON
     end //end for loop j
   end //end for loop i
diff --git a/hdl/verilog/rvv/sve/rvv_backend_tb/hdl/rvv_backend_top.sv b/hdl/verilog/rvv/sve/rvv_backend_tb/hdl/rvv_backend_top.sv
index e17bbf2..727734d 100644
--- a/hdl/verilog/rvv/sve/rvv_backend_tb/hdl/rvv_backend_top.sv
+++ b/hdl/verilog/rvv/sve/rvv_backend_tb/hdl/rvv_backend_top.sv
@@ -153,7 +153,11 @@
     for(int i=0; i<32; i++) begin
       vrf_if.vreg[i] = `VRF_PATH.vrf_rd_data_full[i];
     end
-    vrf_if.vrf_wr_wenb_full = `VRF_PATH.vrf_wr_wenb_full;
+    for(int i=0; i<32; i++) begin
+      for(int j=0; j<`VLENB; j++) begin
+        vrf_if.vrf_wr_wenb_full[i][j*`BYTE_WIDTH +: `BYTE_WIDTH] = {`BYTE_WIDTH{`VRF_PATH.vrf_wr_wen_full[i][j]}};
+      end
+    end
     vrf_if.vrf_wr_data_full = `VRF_PATH.vrf_wr_data_full;
     vrf_if.vrf_rd_data_full = `VRF_PATH.vrf_rd_data_full;
   end: vrf_connect
@@ -216,7 +220,13 @@
   assign rvv_intern_if.rob_empty = DUT.u_rob.u_uop_valid_fifo.empty;
 
   /* vrf */
-  assign rvv_intern_if.vrf_wr_wenb_full = `VRF_PATH.vrf_wr_wenb_full;
+  always_comb begin
+    for(int i=0; i<32; i++) begin
+      for(int j=0; j<`VLENB; j++) begin
+        rvv_intern_if.vrf_wr_wenb_full[i][j*`BYTE_WIDTH +: `BYTE_WIDTH] = {`BYTE_WIDTH{`VRF_PATH.vrf_wr_wen_full[i][j]}};
+      end
+    end
+  end
 
   // Trap
   assign rvv_intern_if.trap_valid_rvs2rvv = DUT.trap_valid_rvs2rvv;
diff --git a/hdl/verilog/rvv/sve/rvv_backend_tb/src/rvs_agent_vrf_interface.sv b/hdl/verilog/rvv/sve/rvv_backend_tb/src/rvs_agent_vrf_interface.sv
index a7715f9..bb153b1 100644
--- a/hdl/verilog/rvv/sve/rvv_backend_tb/src/rvs_agent_vrf_interface.sv
+++ b/hdl/verilog/rvv/sve/rvv_backend_tb/src/rvs_agent_vrf_interface.sv
@@ -15,10 +15,10 @@
   logic [`NUM_RT_UOP-1:0]  rt_last_uop;
 
   task set_dut_vrf(input int reg_idx, input logic[`VLEN-1:0] value);
-    `VRF_PATH.vrf_wr_wenb_full[reg_idx] = '1;
+    `VRF_PATH.vrf_wr_wen_full[reg_idx] = '1;
     `VRF_PATH.vrf_wr_data_full[reg_idx] = value;
     @(posedge clk);
-    `VRF_PATH.vrf_wr_wenb_full[reg_idx] = '0;
+    `VRF_PATH.vrf_wr_wen_full[reg_idx] = '0;
     @(posedge clk);
   endtask: set_dut_vrf
 
diff --git a/hdl/verilog/rvv/sve/rvv_backend_tb/tests/rvv_backend_corner_test.sv b/hdl/verilog/rvv/sve/rvv_backend_tb/tests/rvv_backend_corner_test.sv
index 0289e4a..80a2771 100644
--- a/hdl/verilog/rvv/sve/rvv_backend_tb/tests/rvv_backend_corner_test.sv
+++ b/hdl/verilog/rvv/sve/rvv_backend_tb/tests/rvv_backend_corner_test.sv
@@ -1065,4 +1065,66 @@
     super.final_phase(phase);
   endfunction
 endclass: small_evl_test
+
+
+//-----------------------------------------------------------
+// rob_entry_trap_test
+//-----------------------------------------------------------
+class rob_entry_trap_test extends rvv_backend_test;
+
+  rvs_random_sequence_library rvs_seq_lib;
+  inst_rvv_zve32x_vcpop_m_seq   vcpop_m_seq;
+  inst_rvv_zve32x_viota_m_seq   viota_m_seq;
+  inst_rvv_zve32x_vmv_x_s_seq   vmv_x_s_seq;
+  inst_rvv_zve32x_vadd_vx_seq   vadd_vx_seq;
+  inst_rvv_zve32x_vse8_v_seq    vse8_v_seq;
+  rvs_last_sequence             rvs_last_seq;
+
+  `uvm_component_utils(rob_entry_trap_test)
+
+  function new(string name, uvm_component parent);
+    super.new(name, parent);
+  endfunction
+
+  function void build_phase(uvm_phase phase);
+    super.build_phase(phase);
+    uvm_config_db#(bit)::set(uvm_root::get(), "*", "trap_en", 1'b1);
+    uvm_config_db#(bit)::set(uvm_root::get(), "*", "always_trap", 1'b1);
+  endfunction
+
+  function void connect_phase(uvm_phase phase);
+    super.connect_phase(phase);
+    this.set_report_id_action_hier("MDL", UVM_LOG);
+  endfunction
+
+  task main_phase(uvm_phase phase);
+
+    rvs_seq_lib = rvs_random_sequence_library::type_id::create("rvs_seq_lib");
+    rvs_seq_lib.selection_mode = UVM_SEQ_LIB_RAND;
+    rvs_seq_lib.sequence_count = random_inst_num;
+    rvs_seq_lib.add_typewide_sequence(vcpop_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vcpop_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vcpop_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(viota_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(viota_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(viota_m_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vmv_x_s_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vmv_x_s_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vmv_x_s_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vadd_vx_seq.get_type());
+    rvs_seq_lib.add_typewide_sequence(vse8_v_seq.get_type());
+    rvs_seq_lib.init_sequence_library();
+
+    rand_vrf();
+
+    rvs_seq_lib.start(env.rvs_agt.rvs_sqr);
+
+    rvs_last_seq = rvs_last_sequence::type_id::create("rvs_last_seq", this);
+    rvs_last_seq.start(env.rvs_agt.rvs_sqr);
+  endtask
+
+  function void final_phase(uvm_phase phase);
+    super.final_phase(phase);
+  endfunction
+endclass: rob_entry_trap_test
 `endif // RVV_BACKEND_CORNER_TEST__SV