verilog在always @(posedge clk)中从另一个模块生成实例

时间:2014-11-21 21:06:59

标签: verilog

module save_random (clk,in,out);

parameter size=10;
parameter k=10;
 input clk;
 input [k-1:0] in;


 output [k-1:0]out;
 wire [size:0] cout;

 genvar i;     
generate

for(i=0;i<size;i=i+1)
begin: level1
always@(posedge clk) begin

 random ins(clk,in[i],cout[i+1]);//generte 10 instances from module random to save it //in registers
 end
end

endgenerate
assign cout[0]=in[0];
 assign out=cout[k];
endmodule

我刚开始学习verilog

我有一项任务是编写合成代码,生成10个随机值并将每个值保存在寄存器或Dflipflop中,或者像这样保存。

从模块随机(save_random)(the 2nd one)生成10个实例的第一个connected ..模块,但在使用带有生成i的clk输入时仍然出现错误。

module random(clk,d,cout);

 parameter size=8;
 input [size-1:0] d;    
 input clk;

output  [size-1:0]cout;
reg  [size-1:0]cout;
    integer i;

always@(posedge clk)


begin
     cout<=d;
   end 
   endmodule

1 个答案:

答案 0 :(得分:1)

您无法在always块内实例化模块。由于模块random是一个大小为size的寄存器,因此如果需要多个模块,则只需在生成中实例化该模块:

genvar i;     
generate begin
  for(i=0;i<size;i=i+1) begin: level1
    random ins(clk,in[i],cout[i+1]);
  end
end

但请注意,in[i]cout[i+1]不是8位值。因此,如果要使用完整的8位寄存器,则需要将它们声明为10(或cout)8位向量:

input [7:0] in [9:0];
wire [7:0] cout [10:0];

本教程可能会让您更好地了解生成块的工作原理:https://www.youtube.com/watch?v=5CKfP4n9ge0