System verilog 系统Verilog时钟块
我试图用时钟块的演示代码执行一个简单的测试,但遇到了错误 代码可以在“EDA游乐场”找到 错误是这样的: **错误:testbench.sv(38):必须指定默认时钟块才能使用##n计时语句。 **错误:testbench.sv(40):必须指定默认时钟块才能使用##n计时语句 我认为代码中已经指定了时钟块System verilog 系统Verilog时钟块,system-verilog,System Verilog,我试图用时钟块的演示代码执行一个简单的测试,但遇到了错误 代码可以在“EDA游乐场”找到 错误是这样的: **错误:testbench.sv(38):必须指定默认时钟块才能使用##n计时语句。 **错误:testbench.sv(40):必须指定默认时钟块才能使用##n计时语句 我认为代码中已经指定了时钟块 有什么帮助吗?要解决此错误,请添加默认时钟cb\U计数器在您的计时块之后 第14节涉及时钟模块 // Test program program test_counter; // Syst
有什么帮助吗?要解决此错误,请添加
默认时钟cb\U计数器代码>在您的计时块之后
第14节涉及时钟模块
// Test program
program test_counter;
// SystemVerilog "clocking block"
// Clocking outputs are DUT inputs and vice versa
clocking cb_counter @(posedge Clock);
default input #1step output #4;
output negedge Reset;
output Enable, Load, UpDn, Data;
input Q;
endclocking
default clocking cb_counter; //<-- Set default clocking
// Apply the test stimulus
initial begin
//..
如果模拟器允许系统verilog,我会使用#5ns
,这样它就不依赖于时间步,我发现这对于代码重用来说更具可读性和可靠性
从问题的版本来看,使用了始终块
timeunit 1ns;
// Clock generator
always
begin
#5 Clock = 1;
#5 Clock = 0;
end
正如错误消息所说,您必须将时钟块定义为默认值:
default clocking cb_counter @(posedge Clock);
完整代码如下:
SV 2012标准规定,只有在为模块/程序/接口定义了默认时钟块的情况下,才能使用#n
运算符,否则,它将无法知道使用哪个时钟事件进行延迟。\p>\N延迟不是一个非常有用的功能,除非您可以将它们放在定义时钟块的同一模块或接口中。通常情况并非如此,因为您通常将驱动程序代码放在包中的类中
repeat (N) @cb_counter;
即使通过虚拟接口引用cb
,这也可以统一工作。但它们已经有时间单位1ns代码在模块中,所以没有歧义。@ Dave59,这是真的,但我并没有说有歧义,我只是认为它是最佳实践。我的回答更多的是关于测试台时钟的定义。是的,我收到了一些类似的提示。
repeat (N) @cb_counter;