首页 > 解决方案 > 为什么宏赋值给变量的值会发生变化?

问题描述

在下面的代码中。`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.

标签: system-verilog

解决方案


  1. 第一个 $display 将引用的字符串作为参数获取,因为它在宏中定义。它应该显示这个字符串,没有别的。不知道为什么您的编译器在那里做错工作并显示一个数字。

  2. 您将“val”定义为bit[7:0]。这使得val初始值为 的 2 状态变量0。因此,您的第一个 $display 应该打印0'

  3. 您将T_MANGO_FRUIT宏的值分配给val25 并显示为

  4. 您将一个字符数组作为双引号字符串(“T_MANGO_FRUIT”)分配给val. 同样,不知道为什么你在那里得到 53,它应该是 84,这是第一个 char 的 ascii 代码T。你用的是哪个编译器?

我的猜测是你想这样定义append

`define append(MOD) `T_``MOD``_FRUIT

推荐阅读