【问题标题】:Verilog specify block within for-loopVerilog在for循环中指定块
【发布时间】:2013-08-27 21:09:42
【问题描述】:

我正在尝试为 n 位宽信号建模路径延迟。如果我明确定义每个单独位的延迟,我可以做到这一点,就像这样 (n=3):

specify
    (in_data[0] => delayed_data[0]) = 5;
    (in_data[1] => delayed_data[1]) = 2;
    (in_data[2] => delayed_data[2]) = 1;
endspecify 

但是,当 in_data 为 n 位宽时,我希望能够为 in_data 的每一位指定随机延迟。我的想法是这样的:

for (n=0;n<DATA_WIDTH-1;n=n+1)
begin
    specify
       (in_data[n] => delayed_data[n]) = {$random};
    endspecify
end

这给了我一个错误:“靠近'指定':语法错误,意外指定”

我还尝试将 for 循环放在指定块中。这导致了以下错误:“'near 'begin': syntax error, unexpected begin, expecting endspecify”

我非常感谢有关如何正确执行此操作的任何提示

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    根据Doulos Verilog Reference Guide(第84页),指定块只能出现在moduleendmodule标签内,不能出现在其他任何地方。

    根据this Verilog reference website

    Specify 块旨在定义跨模块的延迟。它以指定开头并以 endspecify 关键字结尾。块内用户可以指定:specparam 声明、路径声明或系统时序检查。

    这似乎意味着它不允许在指定块中使用 for 循环。

    因此,我认为由于语言的限制,您需要将所有值一一写出来。


    您可以尝试的一个想法是重组您的模块,使其具有一位输入到一位输出。然后每个指定块将只有一个延迟指定,您可以为它们分配一个随机值。然后,您可以在 generate 块中生成这些模块,这将避免您必须手动为每个位指定延迟。

    然而,这可能更乏味/尴尬。

    【讨论】:

      猜你喜欢
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多