我有类似于跟随伪代码的东西:
for (lets say 10 iterations)
begin
// Do some configuration changes
fork
begin
///apply input to design
end
begin
while (1)
/// at particular point update expected status / values
end
begin
while (1)
/// read status and verify with expected values
end
join_any
end
Run Code Online (Sandbox Code Playgroud)
从代码:只有输入的应用程序可以解除fork,因为其他2个线程正在工作while(1)我想在每次迭代之间禁用所有线程,即一旦应用了一个输入流 - 禁用所有生成的线程,直到下一次迭代开始(使用新配置)
所以我修改了上面的代码
....
join_any
disable_fork
end
Run Code Online (Sandbox Code Playgroud)
然而,这似乎也禁用了循环以及类似的东西,我不明白,但效果是测试被挂起.有人可以解释一下原因和解决方案吗?
我正在尝试使用SystemVerilog了解有关测试平台的一些内容.但是我似乎无法找到监视程序块内部DUT信号的方法
考虑以下示例.信号'dummy'是DUT的输出并输入到程序块.现在我需要在程序块中监视'dummy'以在'dummy'具有特定值时引发标记'test'.
在一般模块驱动的测试平台中,我只想写@(虚拟),但程序下不允许使用块.我怎么做到这一点?
我有一个简单的序列
regmodel.REGx.write (...)
Run Code Online (Sandbox Code Playgroud)
让我们考虑一下我在 regmodel viz 下有 8 个寄存器。REG0, REG1, REG2,....,REG7 我想通过 number 作为测试加参数,比如 +NUM=4
使用 $sformat 或 $psprintf,我可以创建具有正确寄存器名称的字符串变量,例如
if ($value$plusargs ("NUM=%0d", num))
$display ("Testcase passed %0d num", num);
else
num = 0;
$sformat (regName, "REG%0d", num);
Run Code Online (Sandbox Code Playgroud)
现在我有 regName 但我不能使用以下内容:
regmodel.regName.write (...)
Run Code Online (Sandbox Code Playgroud)
regName 是字符串类型,regmodel 没有任何寄存器名称 regName,还有其他方法可以实现吗?我正在查看 get_name、get_full_name 但在这种情况下这些无济于事。
现在我可以有 if - else 8 次或 case 语句,但是对于大量寄存器来说真的很不方便。
这是一个规范:如果信号a被置位,那么它必须被置位直到信号b被置位然后它应该在下一个时钟边沿取消置位.我正在阅读LRM的16.9.9(以及http://www.testbench.in/AS_06_SEQUENCES.html)和我理解的方式,上面提到的规范可以写成
property a2b_notA;
@(posedge clk) ($rose (a) ##0 (a throughout b)) |=> (~a);
endproperty
a_a2b_notA: assert property (a2b_notA);
Run Code Online (Sandbox Code Playgroud)
然而,这在启动后第二个时钟边沿立即失败,我无法弄清楚原因.