Verilog `在generateif语句中定义
这将为参数Verilog `在generateif语句中定义,verilog,generate,Verilog,Generate,这将为参数syn的所有值生成一位输出。为什么syn>0没有生成2位输出 module test (clk, rst_n, en, rst_n2, in, out ); parameter syn=0; generate if(syn>0)begin `define ROMS end endgenerate input clk; input rst_n;
syn
的所有值生成一位输出。为什么syn>0
没有生成2位输出
module test
(clk,
rst_n,
en,
rst_n2,
in,
out
);
parameter syn=0;
generate if(syn>0)begin
`define ROMS
end endgenerate
input clk;
input rst_n;
input en;
input rst_n2;
`ifdef ROMS
input in;
output reg out;
`endif
`ifndef ROMS
input [1:0] in;
output reg [1:0] out;
`endif
always_ff@(posedge clk or negedge rst_n or negedge en) begin
if(~rst_n) begin
out <= 0;
end else if(clk) begin
out <= 0;
end else if(rst_n2 == 1'b0)begin
out <= 0;
end else begin
out <= in;
end
end
endmodule
模块测试
(时钟,
首先,
EN
rst_n2,
在里面
出来
);
参数syn=0;
如果(syn>0)开始生成
`定义ROM
结束生成
输入时钟;
输入rst\n;
输入en;
输入rst_n2;
`ifdef-ROMS
输入;
输出寄存器输出;
`恩迪夫
`ifndef ROM
在中输入[1:0];
输出寄存器[1:0]输出;
`恩迪夫
始终(posedge clk或NEGDEDGE rst或NEGDEDGE en)开始
如果开始
out因为`define是一个编译指令。在编译代码之前对其进行评估`始终定义ROM,无论syn
的值如何 欢迎来到Stackoverflow。请对您的代码提供更多的解释,以便其他人能够理解。是的,为什么关闭?我完全理解这个问题(虽然在@octobus编辑它之前它的格式很糟糕)@Oldfart投票重新打开它怎么样?@octobus谢谢格式化我的代码。我的问题是,不管参数syn值是多少,`ifdef ROM正在编译,但正如Matthew所回答的,编译器指令在编译代码之前得到评估,因此ROM总是被定义的。在这种特殊情况下,您只需要使用In
和out
的位宽来确定,所以您可以使用模块测试#(参数宽度=1)(输入时钟,rst_输入,en,rst_n2,输入[WIDTH-1:0]输入,输出[WIDTH-1:0]输出);
(ANSI样式标题)另外请注意,clk
不是用作时钟,而是用作异步重置。并且negedge en
开始被视为同步时钟。是的,这是有意义的。Thank有没有办法根据参数值在编译期间删除输入/输出端口?例如,如果参数NUM_ROMS>0,则我希望添加与rom相关的端口otherwise我不想添加这些端口。@KEVINGAJERA不使用参数值,否。但是,您可以为端口指定默认值,然后让它们保持未连接状态。