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不使用参数值,否。但是,您可以为端口指定默认值,然后让它们保持未连接状态。