Verilog在for循环中指定块

时间:2013-08-27 21:09:42

标签: verilog system-verilog

我正在尝试为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循环放在指定块中。这导致以下错误:“接近'开始':语法错误,意外开始,期待结束指定”

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

1 个答案:

答案 0 :(得分:2)

根据Doulos Verilog Reference Guide(第84页),指定区块只能在moduleendmodule标记内发生,而不能在其他任何内容中发生。

根据this Verilog reference website

  

“指定”块用于定义模块的延迟。它以specified开头,以endspecify关键字结束。在块内,用户可以指定:specparam声明,路径声明或系统时序检查。

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

因此,它让我相信由于语言的限制,你需要逐一写出所有的值。


您可以尝试的一个想法是重新构建模块,以便将一位输入转换为一位输出。然后每个指定块只有一个指定的延迟,您可以为它们分配一个随机值。然后,您可以在generate块内生成这些模块,这样可以避免必须手动为每个位指定延迟。

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