在System-verilog中将unsigned int转换为Time

时间:2014-07-21 11:18:01

标签: system-verilog

我的大部分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时间刻度,以试图让我的模拟更快。 其他建议或想法非常受欢迎*

2 个答案:

答案 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);

可能具有负面影响模拟速度,具体取决于时间刻度,时钟事件和延迟单位如何相互关联。