System verilog 为什么在对变量进行宏赋值时,值会发生变化?

System verilog 为什么在对变量进行宏赋值时,值会发生变化?,system-verilog,System Verilog,在下面的代码中`附加(芒果)返回25。其中asval=`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

在下面的代码中<代码>`附加(芒果)返回25。其中as
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
  • 第一个$display获取引用字符串作为参数,正如在宏中定义的那样。它应该显示这个字符串,没有其他内容。不知道为什么编译器会在那里执行错误的任务并显示一个数字

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

  • T\u MANGO\u FRUIT
    宏的值指定给
    val
    ,该值为25,并按此显示

  • 将一个字符数组作为双引号字符串(“T_MANGO_FRUIT”)分配给
    val
    。同样,我也不知道为什么会得到53,它应该是84,这是第一个字符的ascii码
    T
    。你使用了哪种编译器

  • 我猜您希望将
    append
    定义为:

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

    非常感谢您查看代码。一旦我指定了基本说明符并更改为“`
    define append(MOD)
    T
    MOD\u FRUIT`”。工作正常。
    `define append(MOD) `T_``MOD``_FRUIT