SystemVerilog bit流操作方法
一、在循環體中,取出變量的某幾個bit,此時MSB與LSB不能同時含有變量。
- 舉一個例子:
bit [3:0] i, j;
bit [31:0] wdata[4];
for(int i = 0; i < 3; i++) begin
for(int j = 0; j < 3; j++) begin
frame_data[i*4+j] = wdata[i][j*8+7 -:8];
end
end
-
使用macro定義如下:
[MSB-:STEP] = [MSB:MSB-STEP]
[LSB+:STEP] = [LSB+STEP:LSB]
- 例一:从低位往上取数据
bit [7:0] total_length;
bit [3:0] send_data_q[$];
bit [3:0] crc_data_q[$];
for(int i = 0; i < 4; i++) bein
send_data_q.push_front({2'b00, total_length[0+2*i+:2]});
crc_data_q.push_front({2'b00, total_length[0+2*i+:2]});
end
- 例二:从高位往下取数据
bit [31:0] data_tmp;
bit [3:0] inst_data_q[$];
for(int i = 0; i < 8; i++) bein
data_tmp[31-i*4-:4] = inst_data_q.pop_front();
end
二、在sequence中,如何拿到global config?
1、在top_sequencer的build_phase中get資源,在l0_base_vseq的body() task中,利用p_sequencer從top_sequencer中拿回資源,就可以使用了。
三、Covergroup的另類寫法
covergroup araddr_ptk_cov with function sample(apb_vip_tr pkts);
option.per_instance = 1;
option.auto_bin_max = 256;
coverpoint pkts.data[23:2]; //共256個bins
coverpoint pkts.data[2];
coverpoint pkts.data[3];
coverpoint pkts.data[4];
endgroup
1、在uvm_subscriber的build_phase中,將上述covergroup new出來:
araddr_pkt_cov = new();
2、在run_phase中採樣:
if(...) begin
frame.sample();
end
四、通過testlist向TB中傳遞參數$value$plusargs():
例如在testlist中有如下語句:+UVM_VERBOSITY=UVM_LOW +SLOWESTMODE=1
在uvm_axi_cfg.sv中就可以通過$value$plusargs()來獲取這個參數,代碼如下:
class uvm_axi_cfg extends svt_axi_system_configuration;
bit axi_slave_slowest_mode;
bit slowest;
function new(string name = "uvm_axi_cfg");
super.new(name);
$value$plusargs("SLOWESTMODE=%b", slowest);
axi_slave_slowest_mose = (slowest == 0) ? 0 : 1;
this.num_masters = 2;
this.num_slaves = 2;
endfunction
endclass