我的大部分System-Verilog代码都使用参数来定义不同的等待时间,例如:
int unsigned HALF_SPI_CLOCK = ((SYSTEM_CLK_PERIOD/2)*DIVISION_FACTOR); //DEFINES THE TIME
现在,由于我在文件中定义了时间刻度,我可以直接使用这些参数来引入等待周期:
`timescale 1ns/1ns
initial begin
#HALF_SPI_CLOCK;
end
现在我希望到处都有时间限制的延迟。意味着即使我改变时间刻度,模拟仍将遵守所有时间。我想保留参数,但无论我有什么等待语句,我都需要指定时间。像
这样的东西#(HALF_SPI_CLOCK) ns;
但这并不是Modelsim所接受的。有没有办法在System-Verilog中将参数或Unsigned int强制转换为time类型的变量?有没有办法指定时间单位?我环顾四周但找不到任何解决方法。
之所以我想控制时间并让它独立于timescale is because I intend to change the
时间刻度,以试图让我的模拟更快。
其他建议或想法非常受欢迎*
答案 0 :(得分:4)
可以将时间作为SystemVerilog中的参数传递,例如:
module my_module #(time MY_TIME = 100ns);
initial begin
#MY_TIME;
$display("[%t] End waiting", $time);
end
endmodule
或使用乘法来获得正确的时间单位,例如:
module my_module2 #(longint MY_TIME = 100);
initial begin
# (MY_TIME * 1us);
$display("[%t] End waiting 2", $time);
end
endmodule
请参阅EDA Playground上的runnable示例:http://www.edaplayground.com/x/m2
答案 1 :(得分:2)
这将模拟并执行您想要的操作。虽然不是最优雅的,但它确实有效。
task wait_ns(int num);
repeat (num) #1ns;
endtask
...
wait_ns(HALF_SPI_CLOCK);
此可能具有负面影响模拟速度,具体取决于时间刻度,时钟事件和延迟单位如何相互关联。