首页 > 解决方案 > 在实例化的 Verilog 模块 (Yosys/CVC) 中动态检查建立/保持时间违规

问题描述

我有一个 SystemVerilog 测试台 tb_top 实例化给定的 Verilog 模块顶部。上面的代码对我来说实际上是未知的(它来自多个来源),但我知道端口包括一个 100 Hz 时钟(在本文中称为 hundo)、21 个输入和 75 个输出。

我使用 CVC 来模拟带有 Verilog 模块的测试平台,并使用 Yosys 来执行综合。我的目标是在综合后对 Verilog 模块中的任何潜在触发器进行时序检查,并在它们发生时发出警告。

我知道 $setup/$hold 方法,它们在 SystemVerilog 和 CVC 模拟中工作。但是,我想不出一种方法将这些方法动态地应用于顶部模块中的每个触发器。建立时间违规的示例:

module top (hundo, reset, [rest of inputs], ex_output, [rest of outputs]);
  // ... port declarations ...

  reg ex_out;
  always @(posedge hundo, posedge reset)
    if (reset)
      ex_out <= 0;
    else
      ex_out <= hundo;

  assign ex_output = ex_out;
endmodule

这将是我指定设置违规的测试平台:

module tb_top ();
  // ... tb_port declarations ...
  // ... generate clock on tb_hundo ...

specify 
      specparam tsetup = 1;
      $setup(tb_ex_output, posedge tb_hundo, tsetup);
endspecify

top inst (.hundo (tb_hundo), ...);

endmodule

在 CVC 模拟中,这应该会引发警告。但是,它不起作用。有没有办法让它识别模块内触发器的时序违规(不管触发器是否连接到端口输出)?

标签: verilogsystem-verilog

解决方案


您不必在每次翻牌上都应用时序约束。当您运行门级仿真时,您应该有一个供应商门级库。这包括设置和保持时间检查。

正常程序是工具从综合网表中提取时序并生成“SDF”(标准延迟格式)文件。然后运行门级仿真,在其中读取和应用 SDF 文件。只有当门级网表具有时序结构时,SDF 注释才是可能的并且才有意义,不仅适用于门,而且适用于所有互连。


推荐阅读