【发布时间】:2021-11-04 10:23:54
【问题描述】:
我不熟悉使用 verilog 来验证记忆。我在测试台中定义了地址宽度和数据宽度作为参数,我在下面这样尝试,这给了我一个错误:
parameter ADDRESS_WIDTH =9
在测试台的下方某处,我正在调用任务:
Read_mode(ADDRESS_WIDTH’134)
我遇到了一个错误。请帮忙。
【问题讨论】:
标签: verilog test-bench
我不熟悉使用 verilog 来验证记忆。我在测试台中定义了地址宽度和数据宽度作为参数,我在下面这样尝试,这给了我一个错误:
parameter ADDRESS_WIDTH =9
在测试台的下方某处,我正在调用任务:
Read_mode(ADDRESS_WIDTH’134)
我遇到了一个错误。请帮忙。
【问题讨论】:
标签: verilog test-bench
ADDRESS_WIDTH’134 产生语法错误,因为将参数用于数字文字大小是非法的,并且当您使用撇号时,它必须后跟一个基本说明符(例如 h 用于十六进制格式)。此外,您问题中的撇号可能是个问题,具体取决于您如何将其复制并粘贴到编辑器中。
要将数字文字传递给task,不必指定值的位宽,因为在声明task 输入时可以考虑这一点。您可以使用所需的位宽声明输入,然后仅使用基本说明符传递数值,例如 'h134 用于十六进制值:
module tb;
parameter ADDRESS_WIDTH = 9;
task Read_mode (input [ADDRESS_WIDTH-1:0] addr);
$displayh(addr);
endtask
initial begin
Read_mode('h134);
Read_mode(134);
Read_mode('hfff);
end
endmodule
打印:
134
086
1ff
请注意,134(没有底数)是十进制值,大于 9 位 ('hfff) 的值将被强制为 9 位 (1ff)。
请参阅 IEEE Std 1800-2017,第 5.7.1 节 整数文字常量。
【讨论】:
您不能直接在此处使用参数(欢迎使用 verilog)。在 System Verilog 中,它可以使用 typedef 来解决:
parameter ADDRESS_WIDTH = 9;
typedef logic [ADDRESS_WIDTH-1:0] awdt_t;
...
Read_mode(awdt_t'(134));
否则,您可以使用宏
`define ADDRESS_WIDTH 9
...
Read_mode(`ADDRESS_WIDTH'd134);
【讨论】: