Verilog 显示任务

2024 年 8 月 29 日 | 阅读 6 分钟

显示系统任务主要用于显示信息和调试消息,以跟踪日志文件中的仿真流程。有不同的显示任务组及其可以打印值的格式。

通常,显示系统任务分为三类,例如

  1. Display 和 Write 任务
  2. Verilog 选通
  3. 持续监视任务

调用这些任务之一时,它只会打印其参数。 打印参数的顺序与 x 在参数列表中出现的顺序相同。 如果未指定参数,则可以将其声明为空参数,并且在调用显示任务时,它只会打印单个空格字符。 参数可以是返回值的表达式和带引号的字符串。

Display 和 Write 任务

第一组显示任务与 ANSI C 语言中的 print 函数非常相似。 $write 和 $display 任务的工作方式相同,唯一的区别是 $display 任务在输出末尾添加一个换行符,而 $write 任务不添加。

语法

$display$write 都按照参数列表中出现的顺序显示参数。

$write 不会将换行符附加到其字符串的末尾,而 $display 可以从下面显示的示例中看到。

示例

现在,执行上面的代码,我们将得到以下输出。

ncsim> run
This ends with a new line 
This does not, like this. To start a new line, use newline char
Hello!
ncsim: *W,RNQUIE: Simulation is complete.

Verilog 选通

$strobe 在当前 delta 时间步结束时打印变量的最终值,并且具有与 $display 类似的格式。 换行符会自动添加到文本中。

示例

注意:$strobe 显示变量 b 在 10ns 时的最终更新值 0x2E,而 $display 仅在下一个仿真增量 11ns 时才获取该值。

输出如下所示

ncsim> run
[$display] time=10 a=0x2d b=0x2d
[$strobe]  time=10 a=0x2d b=0x2e
[$display] time=11 a=0x2d b=0x2e
[$strobe]  time=11 a=0x2d b=0x2e
ncsim: *W,RNQUIE: Simulation is complete.
ncsim> exit

Verilog 持续监视器

$monitor 帮助自动打印变量或表达式值,只要其参数列表中的变量或表达式发生更改。

它实现了在每次更新其任何参数后调用 $display 的类似效果。 换行符会自动添加到文本中。

示例

$monitor 就像一个在主线程后台运行的任务,它监视和显示其参数变量的值更改。 在仿真期间,可以多次发出新的 $monitor 任务。

Verilog 格式说明符

要在显示函数内部打印变量,必须为每个变量提供适当的 格式说明符

这些任务有一个特殊的字符 (%) 来指示需要有关信号值的信息。 使用字符串时,编译器会识别 % 字符并知道下一个字符是格式规范。

如果使用格式规范符号,则应始终跟随相应的参数(%m 参数除外)。

参数描述
%h, %H以十六进制格式显示
%d, %D以十进制格式显示
%b, %B以二进制格式显示
%o 或 %O显示八进制格式
%m, %M显示分层名称
%s, %S显示为字符串
%t, %T以时间格式显示
%f, %F以十进制格式显示“real”
%e, %E以指数格式显示“real”

可以使用“o”、“h”和“b”扩展名调用这些系统任务。 例如 $writeb, $writeo$displayh。 调用时,它们会通知仿真器存在一些没有相应格式规范的参数,并且应更改默认显示格式。 默认情况下,$display 和 $write 系统任务使用十进制格式来更改显示格式。

显示数据的大小至关重要。 通常,它取决于格式规范。 如果我们使用十六进制格式,则数据将显示为四个字符,每个字符代表值的四个位(单个十六进制值可以表示为四个位)。

同样,八进制值将显示为一组字符,代表三个位。 表达式的结果会自动调整大小。 但是,我们可以通过在 % 字符后添加 0(零)来更改默认设置。

另一个非常有用的显示任务特性是应用于具有未知或高阻抗值的表达式结果的规则。 如果我们使用十进制格式 (%d),那么我们遵循以下规则

  • 当所有位都是未知值时,将显示单个小写“x”字符。
  • 当某些位是未知值时,将显示单个大写“X”字符。
  • 当所有位都是高阻抗值时,将显示单个小写“z”字符。
  • 当某些位是高阻抗时,将显示单个大写“Z”字符。

如果我们使用十六进制 (%h) 和八进制 (%o) 格式,我们遵循以下规则

  • 当组中的所有位都是未知值时,将显示单个小写“x”。
  • 当某些组位是未知值时,将显示单个大写“X”。
  • 当组中的所有位都是高阻抗值时,将显示单个小写“z”。
  • 当组中的某些位是高阻抗时,将显示单个大写“Z”。

注意:在八进制格式中,一个组表示三个位,可以表示为 0 到 7 范围内的单个数字。在十六进制格式中,四个位可以表示为 0 到 9 范围内的单个字符以及 a 到 f 范围内的字符。

示例

上面的代码在执行后给出以下输出,例如

ncsim> run
a = 0e
a =  14
a = 00001110
str = Hello
time =                  200
float_pt = 3.142000
float_pt = 3.142000e+00
ncsim: *W,RNQUIE: Simulation is complete.

Verilog 转义序列

某些字符被认为是唯一的,因为它们代表其他显示目的,例如换行符、制表符和换页符。

要打印这些特殊字符,必须 转义 每个此类字符的出现。

参数描述
\n换行符
\t制表符
\\反斜杠
\ddd八进制代码
%%百分号

示例

输出如下所示

ncsim> run
Newline character 
 
Tab character	stop
Escaping  " %
ncsim: *W,RNQUIE: Simulation is complete.

下一个主题JK 触发器