我正在尝试使用Clocking block的演示代码执行简单测试,但遇到了错误。
代码可以在“EDA playground”http://www.edaplayground.com/x/3Ga
找到错误说: **错误:testbench.sv(38):必须指定默认时钟块才能使用## n时序语句。 **错误:testbench.sv(40):必须指定默认时钟块才能使用## n时序语句。
我认为代码中已经指定了时钟块。
任何帮助?
答案 0 :(得分:3)
如错误消息所示,您必须将时钟块定义为默认值:
default clocking cb_counter @(posedge Clock);
此处的完整代码:http://www.edaplayground.com/x/37_
SV 2012标准规定只有在为模块/程序/接口定义了默认时钟块时才能使用##n
运算符,否则它将无法知道什么时钟事件用于延迟。
答案 1 :(得分:1)
## N延迟不是一个非常有用的功能,除非您可以将它们放在定义时钟块的同一模块或接口中。通常情况并非如此,因为您通常将驱动程序代码放在一个类中封装
repeat (N) @cb_counter;
即使通过虚拟接口引用cb
,它也能统一工作。
答案 2 :(得分:0)
要解决错误,请在计时块后添加default clocking cb_counter;
。
SystemVerilog IEEE1800-2012第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
//..
下面我已经介绍了一种创建测试平台时钟的方法,initial
在触发时很容易计算出来,与原始always
的第一次触发时间相比较我的变化取决于Clk初始化的时间。
initial begin
Clk = 0;
forever begin
#5ns Clk = ~Clk;
end
end
如果你的模拟器允许使用system-verilog,我会使用#5ns
使它不依赖于时间步长,我觉得这对于代码重用更具可读性和可靠性。
问题中的版本,使用了始终阻止。
timeunit 1ns;
// Clock generator
always
begin
#5 Clock = 1;
#5 Clock = 0;
end