区分和展开嵌套在定义宏

时间:2016-05-04 15:59:44

标签: verilog cadence

我想使用文本宏定义参数MYTYPE,其值由文本宏传递,例如

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

然后

`MY_FEATURE(MYTYPE, 1)

但是由其他文本宏定义的那些人混合了价值,例如

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

除非def中的define MY_FEATURE与指令点一起添加,否则后一种情况不起作用。

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

`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

1 个答案:

答案 0 :(得分:1)

我认为你是在思考它。 `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 Std 1364);根据{{​​3}}。这意味着您的MY_FEATURE永远不会创建新的指令;它创建参数。指令和参数在模拟中都被视为常量,但在编译时表现不同。 Verilog(和Verilog派生语言)中的`define / parameters关系等同于manual关系。与C不同,要访问`define的值,需要`前缀。

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

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