system-verilog - 为什么宏赋值给变量的值会发生变化?
问题描述
在下面的代码中。`append(MANGO);
返回 25。其中val = `append(MANGO);
存储在 val 中的值是 53。为什么会这样?
`define T_APPLE_FRUIT 13
`define T_MANGO_FRUIT 25
`define append(MOD) `"`T_``MOD``_FRUIT`"
module test;
bit[7:0] val;
initial begin
$display(`append(MANGO));
$display ("\n\n%d\n",val);
val = `T_MANGO_FRUIT;
$display ("%d\n",val);
val = `append(MANGO);
$display ("\n%d\n",val);
end
endmodule
run -all;
KERNEL: 25
KERNEL:
KERNEL:
KERNEL: 0
KERNEL:
KERNEL: 25
KERNEL:
KERNEL:
KERNEL: 53
KERNEL:
KERNEL: Simulation has finished. There are no more test vectors to simulate.
解决方案
第一个 $display 将引用的字符串作为参数获取,因为它在宏中定义。它应该显示这个字符串,没有别的。不知道为什么您的编译器在那里做错工作并显示一个数字。
您将“val”定义为
bit[7:0]
。这使得val
初始值为 的 2 状态变量0
。因此,您的第一个 $display 应该打印0
'您将
T_MANGO_FRUIT
宏的值分配给val
25 并显示为您将一个字符数组作为双引号字符串(“T_MANGO_FRUIT”)分配给
val
. 同样,不知道为什么你在那里得到 53,它应该是 84,这是第一个 char 的 ascii 代码T
。你用的是哪个编译器?
我的猜测是你想这样定义append
:
`define append(MOD) `T_``MOD``_FRUIT
推荐阅读
- r - 为 linux (Ubuntu for Windows) 安装 biomaRt 包 (R 版本 3.5.2)
- html - 我将宽度 pf 搜索框设置为 0。但它仍然显示它。可能是因为我使用的是 flex。但为什么?
- vim - 在 .vimrc 映射中使用寄存器
- apache-spark - 使用 SQL 更新 Spark 表中的列
- javascript - 动态更改vue js中的公共路径
- android - 如何使用 ViewModel(MVVM) 将对象从片段传递到活动详细信息视图?
- sql - 在不同条件下两次加入同一张表
- python - OperationalError:没有这样的列,但列在任何地方都不存在
- unix - 使用 Unix 脚本从 ftp 上传和下载文件
- php - 我的 php 代码显示为文本并且不会运行