$value$plusargs字符串参数传递后如何随机


前言

在仿真过程中,经常在命令行通过$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



总结

总的来说就是借助一个关联数组进行查表,来解决字符串不能随机的问题。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值