Verilog:输入信号作为参数

时间:2014-02-12 07:47:10

标签: verilog

我的问题可能是不可避免的,我不确定输入信号是否可以用作verilog中的参数。

我的问题是基于需要根据输入信号选择两个可用实例中的一个。这个信号在系统后是静态的。

module DUT (signal1 ....)
  input signal1; // this signal to be used as parameter
  `ifdef signal1
      X U1
  `else
      Y U1
  `endif
endmodule

这里X和Y是两个不同的模块。 也可以使用替代建议来实现相同的建议。

问候


进一步说明:

合成后我只想要两块硬件中的一块。我想要一种语法,可以允许由信号控制的硬件配置,该信号将具有静态值。 Signal1将在设计的其他部分连接到0或1。我知道这似乎是一种不正确的做事方法,但它是一个多模块设计,我无法控制其他块。

3 个答案:

答案 0 :(得分:3)

如果你真的想避免使用参数并希望使用信号,根据你的综合工具,可能得到你想要的。

您需要确保signal1强制您不想要不关心的模块输出。如果您的综合工具足够智能(大多数都是),它将优化该模块。

以下是一个例子:

module DUT (signal1, out....)
  input signal1; // this signal to be used as parameter

      X U1 (in,out_x)
      Y U2 (in,out_y)

      assign out = (signal1) ? out_x : out_y;
endmodule

如果在细化过程中,综合工具看到signal1始终为1,则可以优化模块Y.

正如其他人所说,这不是一种常见/推荐的做法。

另外,使用`ifdef无法实现这一点,因为它们是在编译时处理的。在精化时处理信号的值以及如果信号静态为1或0的事实。

答案 1 :(得分:1)

正如摩根建议的那样,您可以将parametersgenerate块一起使用来代替您想做的事情。这里的工作示例:http://www.edaplayground.com/x/2w2

module X();
    initial begin
        $display("%m is module X!");
    end
endmodule

module Y();
    initial begin
        $display("%m is module Y!");
    end
endmodule

module top();

    parameter USE_X_NOT_Y = 1'b0;

    generate
        if(USE_X_NOT_Y == 1'b1) begin
            X U1();
        end
        else begin
            Y U1();
        end
    endgenerate

endmodule

然后,当您实例化此模块时,您可以覆盖参数以获得所需的行为:

top #(.USE_X_NOT_Y(1))  top_inst ();

答案 2 :(得分:0)

没有。实例是隐含的硬件块。除非你是一个邪恶的机器人,否则你无法动态创建和销毁硬件。

您可以做的是使用输入信号作为两个块的启用/禁用,以便只有1个处于活动状态,然后OR结果一起或暗示多路复用器,以选择所需的输出。

module DUT (
  input signal1, //sel_x
  output tx
); 
reg x_tx;
reg y_tx;

      X U1(.en(signal1),  .out(x_tx) ... );
      Y U1(.en(~signal1), .out(y_tx) ... );

      assign tx = (signal1) ? x_tx : y_tx ;

endmodule