系统Verilog时钟模块

时间:2014-06-01 06:03:56

标签: system-verilog

我正在尝试使用Clocking block的演示代码执行简单测试,但遇到了错误。

代码可以在“EDA playground”http://www.edaplayground.com/x/3Ga

找到

错误说: **错误:testbench.sv(38):必须指定默认时钟块才能使用## n时序语句。 **错误:testbench.sv(40):必须指定默认时钟块才能使用## n时序语句。

我认为代码中已经指定了时钟块。

任何帮助?

3 个答案:

答案 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