簡體   English   中英

系統Verilog時鍾塊

[英]System Verilog Clocking block

我正在嘗試使用Clocking塊的演示代碼執行一個簡單的測試,但是遇到了錯誤。

可以在“ EDA游樂場” http://www.edaplayground.com/x/3Ga上找到該代碼

錯誤顯示:**錯誤:testbench.sv(38):必須指定默認時鍾塊才能使用## n計時語句。 **錯誤:testbench.sv(40):必須指定默認時鍾塊才能使用## n時序語句。

我認為時鍾塊已在代碼中指定。

有幫助嗎?

如錯誤消息所述,您必須將時鍾模塊定義為默認值:

default clocking cb_counter @(posedge Clock);

完整代碼在這里: http//www.edaplayground.com/x/37_

SV 2012標准規定,只有在為模塊/程序/接口定義了默認時鍾塊的情況下,才可以使用##n運算符,否則,它將無法知道將哪個時鍾事件用於延遲。

除非可以將## N延遲放在定義時鍾模塊的模塊或接口中,否則它不是一個非常有用的功能。通常不是這種情況,因為通常將驅動程序代碼放在包內的類中。

repeat (N) @cb_counter;

即使通過虛擬接口引用cb ,這也可以統一工作。

要解決該錯誤,請添加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

如果您的模擬器允許系統驗證日志,我將使用#5ns以便它不依賴於時間步長,我發現這對於代碼重用而言更具可讀性和可靠性。

問題的版本使用了always塊。

  timeunit 1ns;
  // Clock generator
  always
  begin
    #5 Clock = 1;
    #5 Clock = 0;
  end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM