2

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

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

4

1 回答 1

3

根据Doulos Verilog 参考指南(第 84 页),指定块只能出现在moduleendmodule标签内,而不能出现在其他任何东西内。

根据这个 Verilog 参考网站

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

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

因此,它使我相信由于语言的限制,您需要将所有值一一写出。


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

但是,这可能更乏味/尴尬。

于 2013-09-03T16:46:42.680 回答