【问题标题】:Convert unsigned int to Time in System-verilog在 System-verilog 中将 unsigned int 转换为时间
【发布时间】:2014-07-21 11:18:00
【问题描述】:

我的 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 中将参数或无符号整数转换为时间类型的变量?有没有办法指定时间单位?我环顾四周,但找不到任何解决方法。 我想要控制时间并使其独立于timescale is because I intend to change thetimescale 的原因是为了让我的模拟更快。 非常欢迎其他建议或想法*

【问题讨论】:

  • 我会考虑在每个模块中使用timeunit 1ns,这样就不用担心最后一次调用`timescale了。

标签: system-verilog


【解决方案1】:

在 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 上的可运​​行示例:http://www.edaplayground.com/x/m2

【讨论】:

  • 是的,没错。但是,有时我需要从模块中的不同参数中得出等待时间。计算是在一些重要等待期的运行时完成的,因此我需要在运行中转换为 TIME 变量...
  • @MehdiTabs 使用乘法可能是这里最好的解决方案。
【解决方案2】:

这将模拟并执行您想要的操作。虽然不是最优雅的,但它确实有效。

task wait_ns(int num);
  repeat (num) #1ns;
endtask 

...

wait_ns(HALF_SPI_CLOCK);

可能会对模拟速度产生负面影响,具体取决于时间刻度、时钟事件和延迟单位之间的关系。

【讨论】:

  • 谢谢@dwikle 实际上,到目前为止我发现的最佳选择是乘以 1ns。我首先创建unsigned int waiting_abs,然后使用不同的时序参数计算它。我还创建了time waiting_ns。然后很容易投 => waiting_ns = waiting_abs * 1ns;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多