欢迎大家加入2022届数字IC交流群,QQ群号 1060380138
class TestClass;
rand bit[3:0] my_array[];//dynamic array of bit[3:0]
endclass
constraint c_rand_array_uniq {
my_array.size == 6; //or any size constraint
unique {my_array}; //unique array values
}
constraint c_rand_array_inc {
my_array.size == 6 ;// or any size constraint
foreach (my_array[i])
if(i >0)
my_array[i] > my_array[i-1];
}
function post_randomize();
my_array.shuffle();
endfunction
systemverilog支持三种类型的动态进程,可以在运行时创建,并作为独立线程执行。
initial begin
fork
task1; // Process 1
task2; // Process 2
task3; // Process 3
join $display(“All tasks finished”);
end
initial begin
fork
task1; // Process 1
task2; // Process 2
task3; // Process 3
join_any
$display(“Any one of task1/2/3 finished”);
end
initial begin
fork
task1; // Process 1
task2; // Process 2
task3; // Process 3
join_none
$display(“All tasks launched and running”);
end
在使用“ fork..join_none”或“ fork..join_any”时,有时候需要父进程和子进程进行同步,这可以通过wait fork完成。
initial begin
fork task1; // Process 1
task2; // Process 2
join_none
$display(“All tasks launched and running”);
wait fork;
$display(“All sub-tasks finished now”);
end
类似的,disable fork可以提前将子进程停止。
initial begin
fork
task1; // Process 1
task2; // Process 2
join_any
$display(“One of task1/2 completed ”);
disable fork;
$display(“All other tasks disable now”);
end
systemverilog中编写的常规约束为硬约束,对成员的随机化必须始终满足约束,如果约束无解,则会导致错误。如果将约束定义为软约束,在没有外部约束的条件下,和硬约束一样,外部约束的优先级比软约束高。软约束通常用于指定随机变量的默认值和分布,并且可以被外部特定的约束覆盖。
class Packet;
rand int length;
constraint length_default_c {
soft length inside {32,1024};
}
endclass
Packet p = new();
p.randomize() with { length == 1512; }
上例中,如果约束没有定义为软约束,则随机化会失败。
initial begin
for (int j=0; j<3; j++) begin
fork
automatic int result;
begin
result= j*j;
$display("Thread=%0d value=%0d", j, value);
end
join_none
wait
fork;
end
end
由于“ j”不是每个线程的动态变量,因此在生成每个线程后它会不断递增,并且当所有线程开始执行时,每个线程将看到的j都是3。因此,每个线程都将输出9。如果每个线程打算使用不同的值,则应将“ j”的值复制到一个自动变量,如下所示:
automatic int k = j;
begin
result = k*k;
end
你答对了吗
fork
for (int i=0; i < 10; i++ ) begin
ABC();
end
join
class packet;
rand bit [15:0] a, b, c;
constraint pkt_c { 0 < a < b < c; }
endclass
1)
class ABSolveBefore;
rand bit A;
rand bit [1:0] B;
constraint c_ab { (A==0) -> B==0; solve A before B; }
endclass
2)
class ABSolveBefore;
rand bit A;
rand bit [1:0] B;
constraint c_ab { (A==0) -> B==0; solve B before A; }
endclass
正确答案将在下一期公布,或者到下面的文章获取答案