我正在尝试为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循环放在指定块中。这导致以下错误:“接近'开始':语法错误,意外开始,期待结束指定”
我非常感谢有关如何正确执行此操作的任何提示
答案 0 :(得分:2)
根据Doulos Verilog Reference Guide(第84页),指定区块只能在module
和endmodule
标记内发生,而不能在其他任何内容中发生。
根据this Verilog reference website:
“指定”块用于定义模块的延迟。它以specified开头,以endspecify关键字结束。在块内,用户可以指定:specparam声明,路径声明或系统时序检查。
这似乎意味着它不允许指定块中的for循环。
因此,它让我相信由于语言的限制,你需要逐一写出所有的值。
您可以尝试的一个想法是重新构建模块,以便将一位输入转换为一位输出。然后每个指定块只有一个指定的延迟,您可以为它们分配一个随机值。然后,您可以在generate
块内生成这些模块,这样可以避免必须手动为每个位指定延迟。
然而,这可能会更乏味/尴尬。