区分和扩展嵌套在定义宏中的文本宏

Distinguish and expand text macro nested in define macro

我想用文本宏定义一个参数MYTYPE,其值由文本宏传递过来,例如

`define MY_FEATURE(nam,def) parameter nam=def;

然后是

`MY_FEATURE(MYTYPE, 1)

但该值被其他文本宏定义的值混合,例如

`MY_FEATURE(NEWTYPE, 2)
`MY_FEATURE(MYTYPE, NEWTYPE)

后一种情况将不起作用,除非 define MY_FEATURE 中的 def 加上指令点。

我需要区分这两种不同的情况并自动扩展宏 - 仅当它被定义时,所以我想出了这段代码但我得到了错误。

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) `ifdef def parameter nam=`def; `else parameter nam=2; `endif

module test;

  `MY_FEATURE(MYTYPE,yea)
  initial begin
    $display("%d",MYTYPE);
  end
endmodule

以上代码有效并给出了 1 作为输出。但是,如果我写

`MY_FEATURE(MYTYPE,10)

因为对于其他情况我需要为参数分配一个实际数字,那么我将得到

 `ifdef without a macro name - ignored.

我想要的结果是 MYTYPE 被分配为 10。 有什么办法可以做到这一点?谢谢。

代码可以在这里找到 http://www.edaplayground.com/x/6Jha

我觉得你想多了。 `define 创建一个指令表达式。当你将一个指令作为参数传递给另一个指令时,你可以将它作为 `yea 传递。

这是一个例子:

`define yea 1
`define nop 0
`define MY_FEATURE(nam,def) parameter nam=def;

module test;
  `MY_FEATURE(MYTYPE,`yea)
  `MY_FEATURE(MYTYPE2,10)
  `MY_FEATURE(MYTYPE3,MYTYPE+MYTYPE2)
  initial begin
    $display("%d %d %d",MYTYPE, MYTYPE2, MYTYPE3); // displays: 1 10 11
  end
endmodule

http://www.edaplayground.com/x/5Pgf


Verilog-AMS(Verilog-A 的超集)是一种自己的语言,源自 Verilog(IEEE 标准 1364);根据 manual. This means your MY_FEATURE never creates new directives; it creates parameters. Directives and parameters are both treated as constants in simulation but act differently in compile. The `define/parameters relation in Verilog (and Verilog derived languages) is equivalent to C's #define/const 关系。与 C 不同,要访问 `define 的值需要 ` 前缀。

指令或参数均不能以数值开头。第一个字符必须是字母或下划线(又名 [a-zA-Z_])。 10 永远不能成为指令,甚至试图使用它也是非法语法。编译无法从非法语法指令名称中恢复。这是我建议传递 `yea 而不是 yea.

的方式

如果有人为您构建了一个 nice 模型,那么它应该同样带有 nice 文档或某种获得支持的方式。