Verilog for循环内的specify块

3

我正在尝试为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时,我想能够为每个位指定随机延迟。我的想法是这样的:

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

这给了我一个错误:

附近的'specify':语法错误,意外的specify

我还尝试将for循环放在specify块中。结果出现以下错误:

附近的'begin':语法错误,意外的begin,期望endspecify

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

1个回答

4
根据Doulos Verilog参考指南(第84页)的说法,specify块只能出现在moduleendmodule标签之间,而不能出现在其他任何地方。
根据这个Verilog参考网站的说法:

Specify块的设计是为了定义模块之间的延迟。它以specify开头,以endspecify关键字结束。用户可以在块内指定:specparam声明、路径声明或系统时序检查。

这似乎意味着它不允许在specify块内使用for循环。
因此,我认为由于语言的限制,您需要逐个编写所有值。
您可以尝试的一个想法是重构您的模块,使其具有一个位输入到一个位输出。然后,每个specify块将只有一个要指定的延迟时间,并且您可以为它们分配每个随机值。然后,在generate块中生成这些模块,这样您就不必手动为每个位指定延迟时间。 然而,这可能更加繁琐和棘手。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接