在verilog语言教材中,最常用的两种变量类型是wire和reg,对于wire,大家都比较容易理解,即互连的“线”信号,但对于“reg”是否就一定是寄存器呢,更通俗地说,在FPGA是否就体现为D触发器或锁存器呢。
可能受如下语句的影响:
reg abc_reg;
always @ ( posedge clk or negedge rest_n )
begin
if ( reset_n == 1'b0 )
abc_reg <= 1'b0;
else
abc_reg <=
abc_in;
end
在综合后,都映射为D触发器类型,因此一般人都有一种误解,reg类型的变量,综合后,都为触发器。
实际上,reg只是一种类型定义,是否该定义为reg或wire,需跟实际结合。在常用的可综合语句结构(如always)中,要求将变量都定义为reg。
如下语句:
reg abc_reg;
always @ ( abc_in0 or abc_in1 or abc_in_en )
begin
if ( abc_in_en == 1'b1 )
abc_reg = abc_in0;
else
abc_reg = abc_in1;
end
实际上,该块综合后,只是一个2选1的组合逻辑,等同如下代码:
wire abc_reg;
assign abc_reg = ( abc_in_en == 1'b1 ) ? abc_in0 : abc_in1;
因此,我们是否可以得出如下结论:
(1)reg类型变量不一定映射为触发器;
(2)always语句中的变量,要求定义为reg类型;
(3)其他语句,,。