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.