在Verilog中传递参数

在Verilog中传递参数,verilog,fpga,Verilog,Fpga,我正在Verilog中编写一个使用参数的模块。稍后,我将需要在我的项目中使用不同的参数多次实现它,因此,我不想将参数作为输入传递给多个模块,尽管它们是在编译中指定的 我认为这可以在VHDL中完成,所以我想也可以在Verilog中完成,尽管我找不到任何东西 模块参数可以通过以下两种方式覆盖: 使用defparam语句: module Stack; parameter param1 = 1; parameter param2 = 12; endmodule module Test; def

我正在
Verilog
中编写一个使用参数的模块。稍后,我将需要在我的项目中使用不同的参数多次实现它,因此,我不想将参数作为输入传递给多个模块,尽管它们是在编译中指定的


我认为这可以在
VHDL
中完成,所以我想也可以在
Verilog
中完成,尽管我找不到任何东西

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

  • 使用
    defparam
    语句:

    module Stack;
    
    parameter param1 =  1;
    parameter param2 = 12;
    
    endmodule
    
    module Test;
    
    defparam s1.param1 =  6;
    defparam s1.param2 = 32;
    
    Stack s1();
    
    endmodule
    
  • 在实例化过程中传递参数:在这个方法中,参数必须按照定义的顺序被重写,所以下面的代码与上面的代码相同

    module Stack;
    
    parameter param1 =  1;
    parameter param2 = 12;
    
    endmodule
    
    module Test;
    
    Stack #(6, 32) s1();
    
    endmodule
    
    • 在Verilog 2001中,有一个新特性使其更具可读性(请注意,上面的代码都在Verilog 2001中工作)


  • 您可以在输入和输出分配期间直接分配参数。例如:“参数i0=0,i1=1;”并在代码中调用这些值,例如:“a[0]=N[i0];”=>输入N的第0位;将存储在reg a的第0位;“a[1]=N[i1];”=>输入N的第1位;将存储在reg a的第1位;如果N为4'b1011,则“a=0011”的值。您可能必须将a初始化为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`
    
    `模块顶部#(
    参数N,//实例数
    参数[(N*32-1):0]A,//第一个参数
    参数[(N*2-1):0]B//第二个参数
    );
    生成
    
    对于(int i=0;i)您的问题除了在verilog中使用
    defparam
    之外?可能是重复的,您介意检查下面的答案吗?
    `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`