【问题标题】:`define in generate if statement`在生成 if 语句中定义
【发布时间】:2019-12-10 09:53:53
【问题描述】:

这会为参数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 

【问题讨论】:

  • 欢迎来到 Stackoverflow。请对您的代码提供更多解释,以便其他人能够理解。
  • 是的,为什么关闭?我完全理解这个问题(尽管在@octobus 编辑它之前它格式错误)
  • @Oldfart 投票重新开放怎么样?
  • @octobus 感谢格式化我的代码。我的问题与参数 syn 值无关,`ifdef ROMS 正在编译,但正如 Matthew 回答的那样,编译器指令在编译代码之前被评估,因此始终定义 ROMS。
  • 在这种特殊情况下,您仅确定位宽为inout,因此您可以使用module test #(parameter WIDTH=1) (input clk, rst_in, en, rst_n2, input [WIDTH-1:0] in, output reg [WIDTH-1:0] out);(ANSI 样式标头)。另请注意,您的 clk 不是用作时钟,而是用作异步重置。而negedge en 开始被视为同步时钟。

标签: verilog generate


【解决方案1】:

因为`define 是一个编译指令。在编译您的代码之前对其进行评估。 `ROMS 总是被定义,无论syn 的值是什么。

【讨论】:

  • 是的,这是有道理的。谢谢
  • 有没有办法在编译期间根据参数值删除输入/输出端口?前任。如果参数 NUM_ROMS 大于 0,则我想添加 rom 相关端口,否则我不想添加这些端口。
  • @KEVINGAJERA 不使用参数值,不。但是,您可以为端口提供默认值,然后让它们处于未连接状态。
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 2023-03-19
  • 2012-11-27
  • 1970-01-01
  • 2011-03-26
  • 2011-10-14
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多