在Verilog中传递参数

时间:2016-02-22 16:25:34

标签: verilog fpga

我在Verilog编写了一个使用参数的模块。稍后我将需要在我的项目中使用不同的参数多次实现它,因此我不想创建几个模块,而是将参数传递给它们,就好像它们是输入一样,尽管它们是在编译中指定的。

我认为这可以在VHDL中完成,所以我想它也可以在Verilog中完成,虽然我找不到任何东西。

3 个答案:

答案 0 :(得分:0)

模块parameters可以通过以下两种方式覆盖:

  1. 使用defparam声明:

    module Stack;
    
    parameter param1 =  1;
    parameter param2 = 12;
    
    endmodule
    
    module Test;
    
    defparam s1.param1 =  6;
    defparam s1.param2 = 32;
    
    Stack s1();
    
    endmodule
    
  2. 在实例化过程中传递参数:在此方法中,必须按照定义的顺序覆盖参数,因此下面的代码与上面的代码相同。

    module Stack;
    
    parameter param1 =  1;
    parameter param2 = 12;
    
    endmodule
    
    module Test;
    
    Stack #(6, 32) s1();
    
    endmodule
    
    • 在Verilog 2001中,有一个新功能使其更具可读性(请注意,以上代码均适用于Verilog 2001)。

      module Stack;
      
      parameter param1 =  1;
      parameter param2 = 12;
      
      endmodule
      
      module Test;
      
      Stack #(.param1(6), .param2(32)) s1();
      
      endmodule
      

答案 1 :(得分:0)

您可以在输入和输出分配期间直接分配参数。例如:“参数i0 = 0,i1 = 1;”并在代码中调用这些值,例如:“a [0] = N [i0];” =>输入N的第0位;将存储在reg a的第0位; “一个[1] = N [I1];”=>输入N的第1位;将存储在reg a的第1位;如果你的N是4'b1011,那么“a = 0011”的值。您可能必须将a初始化为0.

答案 2 :(得分:0)

另一种方式。

`module top #(
parameter N, // Number of instance
parameter [(N*32-1):0] A, // First Parameter
parameter [(N*2-1):0] B   // second parameter
);
generate
for (int i=0; i<N; i++) begin: instance
  s #(.A(A[(i*32-1):0]),
      .B(B[(i*2-1):0])
     ) s_i;
end
endgenerate`