文章目录
- 前言
- 一、背景
- 二、解决办法
- 总结
前言
在仿真过程中,经常在命令行通过$value$plusargs传递一个字符串到环境中,去选择不同的sequence,但是,有些时候需要随机选择其中某几个seq,而只有整数和枚举类型可以随机,字符串无法随机,那么如何解决这个问题呢?
一、背景
代码如下,axi_slave_mem_seq是一个字符串变量,期望外部如果传进来的值是“axi_slave_random_rsp_seq”,那么就随机选取其中有效的sequence,但是由于字符串类型不支持随机,编译会报错。
二、解决办法
解决方案如下,定义一个枚举类型AXI_SLAVE_MEM_SEQ_e,定义枚举类型与字符串的关联数组表axi_slave_mem_table,当外部传进来一个字符串,首先通过关联数据表找到对应的枚举类型,然后对枚举类型变量进行判断,如果是需要随机的枚举类型变量,那么再对枚举类型的变量进行随机,最后将处理后的枚举变量拿去处理。
typedef enum {
AXI_SLAVE_SEQ,
AXI_SLAVE_MEM_NODELAY_SEQ,
AXI_SLAVE_MEM_SEQ,
AXI_SLAVE_MEM_RD_LONGDELAY_SEQ,
AXI_SLAVE_MEM_WR_BACKPRESSURE_SEQ,
AXI_SLAVE_MEM_OUTSTANDING_SEQ,
AXI_SLAVE_QDMA_RSP_BACKPRESURE_SEQ,
AXI_SLAVE_MEM_RANDOM_SEQ,
AXI_SLAVE_MEM_RPOISON_SEQ
} AXI_SLAVE_MEM_SEQ_e;
AXI_SLAVE_MEM_SEQ_e axi_slave_mem_table [string] = {
"axi_slave_seq" : AXI_SLAVE_SEQ,
"axi_slave_mem_nodelay_seq" : AXI_SLAVE_MEM_NODELAY_SEQ,
"axi_slave_mem_seq" : AXI_SLAVE_MEM_SEQ,
"axi_salve_mem_rd_longdelay_seq" : AXI_SLAVE_MEM_RD_LONGDELAY_SEQ,
"axi_slave_mem_wr_backpressure_seq" : AXI_SLAVE_MEM_WR_BACKPRESSURE_SEQ,
"axi_slave_mem_outstanding_seq" : AXI_SLAVE_MEM_OUTSTANDING_SEQ,
"axi_slave_qdma_rsp_backpresure_seq" : AXI_SLAVE_QDMA_RSP_BACKPRESURE_SEQ,
"axi_slave_random_seq" : AXI_SLAVE_MEM_RANDOM_SEQ,
"axi_slave_mem_rpoison_seq" : AXI_SLAVE_MEM_RPOISON_SEQ
};
string axi_slave_mem_seq_s = "axi_slave_seq";
AXI_SLAVE_MEM_SEQ_e axi_slave_mem_seq_e = AXI_SLAVE_SEQ; // default
if ($value$plusargs("axi_slave_mem_seq=%s", axi_slave_mem_seq_s)) begin
`uvm_info(`gfn, $sformatf("Get axi_slave_mem_seq is %s", axi_slave_mem_seq_s),UVM_LOW)
if(axi_slave_mem_table.exists(axi_slave_mem_seq_s))
axi_slave_mem_seq_e = axi_slave_mem_table[axi_slave_mem_seq_s];
else
`uvm_error(`gfn, "ERROR! No axi slave seq has been selected!")
end
if(axi_slave_mem_seq_e == AXI_SLAVE_MEM_RANDOM_SEQ) begin
assert(std::randomize(axi_slave_mem_seq_e) with{
axi_slave_mem_seq_e inside {
AXI_SLAVE_SEQ,
AXI_SLAVE_MEM_NODELAY_SEQ,
AXI_SLAVE_MEM_SEQ,
AXI_SLAVE_MEM_RD_LONGDELAY_SEQ,
AXI_SLAVE_MEM_WR_BACKPRESSURE_SEQ,
AXI_SLAVE_MEM_OUTSTANDING_SEQ,
AXI_SLAVE_QDMA_RSP_BACKPRESURE_SEQ
};
});
end
set_axi_slave_mem_seq(axi_slave_mem_seq_e);
function void set_axi_slave_mem_seq(AXI_SLAVE_MEM_SEQ_e axi_slave_mem_seq);
case (axi_slave_mem_seq)
AXI_SLAVE_SEQ : begin
// do something
end
AXI_SLAVE_MEM_NODELAY_SEQ : begin
end
AXI_SLAVE_MEM_SEQ : begin
end
AXI_SLAVE_MEM_RD_LONGDELAY_SEQ : begin
end
AXI_SLAVE_MEM_WR_BACKPRESSURE_SEQ : begin
end
AXI_SLAVE_MEM_RPOISON_SEQ : begin
end
...
...
...
endcase
总结
总的来说就是借助一个关联数组进行查表,来解决字符串不能随机的问题。