System Verilog中的randcase与randsequence

System Verilog中的randcase与randsequence

1、Randcase

randcase语法会随机选择case的一条分支执行,我们也可以给每个分支指定不同的权重(权重必须为非负整数),改变每条分支的执行概率,一天分支的概率为该分支的权重值除以所有分支的权重值之和。

randcase
	4:x=1;//1的概率为50%,4/(4+1+3)
	1:x=2;//2的概率为12.5%,1/(4+1+3)
	3:x=3;//3的概率为37.5%,3/(4+1+3)
endcase

权重值也可以为表达式,但结果要为非负整数,执行的分支可以为表达式,代码块,function或task:

initial begin
byte a, b
	randcase:
		a+b:do_one_read();//执行此分支的概率:(a+b)/(2a+12'h800)
		a-b:do_one_write();//执行此分支的概率:(a-b)/(2a+12'h800)
		12'h800:do_two_write();//执行此分支的概率:(12'h800)/(2a+12'h800)
	endcase
end

task do_one_read();
	$display("do_one_read!!!!")
endtask

task do_one_write();
	$display("do_one_write!!!!")
endtask

task do_two_write();
	$display("do_two_write!!!!")
endtask

2、Randsequence

随机序列如下:

initial begin
	for(int i=0;i<15;i++) begin
		randsequence(stream)
			stream:cfg_read:=1 | io_read:=2 | mem_read:=5;
			cfg_read:{cfg_read_task;} |  {cfg_read_task;} cfg_read;
			io_read:{io_read_task;} | {io_read_task;} io_read;
			mem_read:{mem_read_task;} | {mem_read_task;} mem_read;
	end
end

task cfg_read_task
endtask

上例中,产生了随机序列stream,它将执行cfg_read、io_read和mem_read三者中的一个,cfg_read的权重是1,io_read的权重是2,mem_read的权重是5.
cfg_read序列的意思是执行一次cfg_read_task或执行多次cfg_read_task,当随机到{cfg_read_task;}时,执行一次cfg_read_task就结束,当随机到{cfg_read_task;} cfg_read时,执行完一次cfg_read_task后,再跳到cfg_read序列,重新执行cfg_read序列,重新执行前面的过程。在序列中没有执行权重时,权重默认是1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值