来自 vhdl 程序员的 verilog 中的通用

Generic in verilog from a vhdl programmer

verilog 中泛型的等价物是什么? 例如

entity my_entity
generic(a : integer);
port(x : in std_logic; y out std_logic);
end entity my_entity;

通用的等价物是什么? 另外,if generate 和 for generate 的等价物是什么?

泛型在 Verilog 中称为参数。它们在模块中通过以下行声明:

parameter DATA_WIDTH = 8;
parameter ADDR_WIDTH = 8;

实例化可以单独细化参数值:

my_ram_impl #( 
  .DATA_WIDTH(16), 
  .ADDR_WIDTH(8)
)
ram_instance(
  .clk(clk),
  .addr(addr),
  .data(data),
  .cs(cs),
  .we(we)
); 

使用这些类似于 C 的指令进行条件综合:

`ifdef  SYM
   ...
`else
   ...
`endif

或者,更灵活地 generate 构造如下:

generate
  if(cond)
    ...
  else
    ...
endgenerate

这是一个如何使用 for generate 来实例化模块的示例,core_top 在本例中。 NCORE 是父模块的参数或指定要实例化的内核数的本地参数。

  wire clk;
  wire [31:0] data_from_core[0:NCORES-1];

  genvar core;
  generate
    for (core=0; core < NCORES; core=core+1) begin : core_gen
         core_top
            #(.CORE_ID  (core),
              .NCORES   (NCORES))
           u_fpgaminer_top
             (.clk_in          (clk),
              .data_out        (data_from_core[core]));
      end
  endgenerate