我想使用文本宏定义参数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
答案 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 文档或某种获得支持的方式。