Verilog reg分配?

时间:2016-11-28 15:30:50

标签: verilog

我对Verilog编程完全陌生,我不明白在哪里初始化reg变量?

让我们看一下以下片段: 编辑: Warning at synthesize

module test (
       output LED0 
       );   
reg led = 1'b1;
assign LED0 = led;
endmodule   

module test (
       output LED0 
       );   

reg led;
initial begin
    reg led <= 1'b1;
end

assign LED0 = led;
endmodule

给我:使用led的初始值,因为它从未在行分配:reg led = 1'b1;

{@ 1}}类型是否仅在always @ block中分配?

另一个例子:

reg

这里reg的初始值为0,但我之前将它设置为1 ......出了什么问题?谢谢!

2 个答案:

答案 0 :(得分:1)

  

是否只在always @ block中分配了reg类型?

不,reg种类可以在always块和initial块(加taskfunction中分配,但我会在范围内跳过它们这个问题)

对于fourBitCounterreg[3:0] counter块中声明的initial会创建一个名为counter的局部变量,该变量只能在创建块的范围内访问in。您需要删除初始块中的reg[3:0],以便将分配应用于预期的counter。但它仍然无效,因为您将counter声明为推断的导线类型,而always / initial块无法分配导线。

counter被声明为4位推断线的输出(output [3:0] counteroutput wire [3:0] counter的同义词)。由于在counter块和always块中分配了initial,因此它必须是reg类型。因此,它应声明为output reg [3:0] counter

此外,您在输入和本地线路中声明clk,它不能同时为两者。可以在本地访问端口,没有理由将它们重新声明为本地网络。

仅供参考:对于4位值,15 + 1等于0,因为没有任何东西可以存储MSB。

module fourBitCounter (
    input clk,
    output reg [3:0] counter // 'output reg', not 'output'
  );

//wire clk; // do not do this, clk is an input
initial begin
  counter = 4'b1; // no 'reg' here
end

always @(posedge clk) begin
  if(counter > 15) // this will never evaluate as true with counter declared as 4-bit
    counter <= 0;
  else
    counter <= counter + 1;
end
endmodule

对于Verilog,assign语句只能应用于网络类型(例如wire)。这是合法的:

module test ( output LED0 ); // LED0 is an inferred wire
assign LED0 = 1'b1;
endmodule

这是非法的:

module test ( output reg LED0 ); // Explicit reg
assign LED0 = 1'b1; // illegal, assign on a reg
endmodule

答案 1 :(得分:0)

从您的第一个代码示例:

reg led;             // <-- This declares one register called "led"
initial begin
    reg led <= 1'b1; // <-- This declares a *separate* register called "led"
end                  //     which is only valid in the initial block

第二个样本中存在同样的问题;您在initial块中声明了一个单独的寄存器。如果您只是尝试分配值,请不要使用关键字regwire