verilog里的timescale以及国际单位制前缀

本文介绍了在仿真环境中如何设定时间单位与精度,并详细列举了国际单位制中各种时间单位的表示方法及其对应的数值。

`timescale x/y

 

其中x表示时间单位,y表示时间精度

 

则在仿真的时候,写出#500,则表示500*x这么长的时间

 

如果写成#1.2,则需要考虑精度问题,1.2是否可以在y这个时间精度内表示出来,如果可以,则表示1.2*x这么长的时间,否则表示1.2精度取整之后再乘以x这么长的时间。

 

=========================================

国际单位制前缀

yotta [Y] [Septillion] 10^24 1000000000000000000000000

zetta [Z] [Sextillion] 10^21 1000000000000000000000

exa [E] [Quintillion] 10^18 1000000000000000000

peta [P] [Quadrillion] 10^15 1000000000000000

tera [T] [Trillion] 10^12 1000000000000

giga [G] [Billion] 10^9 1000000000

mega [M] [Million] 10^6 1000000

kilo [k] [Thousand] 10^3 1000

hecto [h] [Hundred] 10^2 100

deca [da][Ten] 10^1 10

--- -- [One] 10^0 1

deci [d] [Tenth] 10^-1 0.1

centi [c] [Hundredth] 10^-2 0.01

milli [m] [Thousandth] 10^-3 0.001

micro [μ] [Millionth] 10^-6 0.000001

nano [n] [Billionth] 10^-9 0.000000001

pico [p] [Trillionth] 10^-12 0.000000000001

femto [f] [Quadrillionth] 10^-15 0.000000000000001

atto [a] [Quintillionth] 10^-18 0.000000000000000001

zepto [z] [Sextillionth] 10^-21 0.000000000000000000001

yocto [y] [Septillionth] 10^-24 0.000000000000000000000001

### Verilog 或 SystemVerilog 中 `$time` 函数的作用 在 Verilog 和 SystemVerilog 中,`$time` 系统函数返回一个 64 位整数的时间值,该时间值以调用该系统函数的模块的时间单位为基准表示仿真时间。当仿真时间的小数部分被传递到 `$time` 函数时,它会对小数部分进行四舍五入处理。 例如,在以下代码中: ```verilog `timescale 10 ns / 1 ns module test; initial begin #1.55 $display($time); end endmodule ``` 输出结果为 ` 2`,这是因为仿真时间单位为 10ns,而延迟时间为 1.55 时间单位(即 15.5ns),经过四舍五入后得到的结果是 2 个时间单位。 ### 仿真时间单位 G 和 M 的区别 在仿真环境中,时间单位 G 和 M 表示的是国际单位制中的前缀千兆(Giga, G)和兆(Mega, M)。具体定义如下: - **千兆(Giga, G)**:代表 \(10^9\) 或者 1,000,000,000。 - **兆(Mega, M)**:代表 \(10^6\) 或者 1,000,000。 因此,在时间单位中: - 1 秒 (s) = \(1 \times 10^{-9}\) 吉秒 (Gs),即 1 秒等于十亿分之一吉秒。 - 1 秒 (s) = \(1 \times 10^{-6}\) 兆秒 (Ms),即 1 秒等于一百万分之一兆秒。 这意味着在仿真过程中,如果指定的时间单位为 Gs,则每一步仿真时间的变化是以纳秒级别计算;如果是 Ms,则变化是以微秒级别计算。两者之间的换算关系为: \[ 1\text{Gs} = 10^3\text{Ms} \] ### 综合分析 `$time` 函数与仿真时间单位的关系 `$time` 返回的值始终基于当前模块所设定的时间单位。例如,假设模块设置了 `timescale` 为 ` 1us/1ns`,那么 `$time` 返回的将是相对于 1 微秒的时间刻度下的整数值。如果仿真时间单位使用 Gs 或 Ms 进行表达,则需要根据实际的时间比例进行换算。例如,若仿真时间单位为 Gs,则 `$time` 返回的实际上是纳秒级别的计数;若是 Ms,则 `$time` 返回的是微秒级别的计数。 此外需要注意的是,虽然 `$time` 提供了一个简单的方式来获取当前仿真时刻的时间戳,但它并不支持浮点精度。对于更高精度需求的应用场景,可以考虑使用 `$realtime` 系统函数,它可以提供实数形式的时间值,并同样遵循模块的时间单位设置。 --- ### 示例代码展示 `$time` 使用方法 以下是一段简单的 Verilog 代码,展示了如何通过 `$time` 获取并打印仿真时间: ```verilog `timescale 1 ms / 1 us module example_time; initial begin #1.23; // 延迟 1.23 时间单位(这是毫秒) $display("Simulation Time: %d", $time); // 打印仿真时间 end endmodule ``` 在这个例子中,由于 `timescale` 被设为了 ` 1ms/1us`,所以 `$time` 将会以毫秒为单位返回仿真时间。考虑到延时为 1.23 毫秒,最终 `$time` 应该返回接近于 1 的整数值。 --- ### 总结 综上所述,`$time` 是一种非常有用的工具,能够帮助开发者轻松获得当前仿真的离散化时间步长。然而,它的表现依赖于具体的模块时间单位配置以及仿真器本身的实现细节。与此同时,理解仿真时间单位 G 和 M 的本质差异有助于更精准地设计与时序相关的逻辑电路模型。
05-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值