Verilog包括四种抽象层次:

  • 行为级或算法级:从算法角度进行设计,不关心具体的硬件实现和细节。
  • 数据流级:描述数据如何在各个寄存器之间流动,如何处理这些数据。这是verilog支持的最高抽象层次。
  • 门级:描述逻辑门及其连接关系。
  • 开关级(晶体管级):描述晶体管及其连接关系。这是verilog支持的最低抽象层次。

我们常说的寄存器传输级(RTL,Register Transfer Level)一般是指行为级和数据流级建模。但我一直以来不太能区分开行为级和数据流级。最近重新看夏宇闻老师翻译的《Verilog HDL数字设计与综合》,发现了比较好的例子。

以四选一多路选择器为例,s0s1是选择信号,i0i1i2i3是输入的数据,out为输出。数据流建模可以写为:

module muux4_to_1(
  	input i0,
  	input i1,
  	input i2,
  	input i3,
  	input s0,
  	input s1,
  
  	output out
);
  
  assign out = (~s1&~s0&i0)|
               (~s1& s0&i1)|
               ( s1&~s0&i2)|
               ( s1& s0&i3);
  
  // 或者如下这样写
  // assign out = s1? (s0? i3 : i2) : (s0? i1 : i0); 
endmodule

行为级建模如下:

module muux4_to_1(
  	input i0,
  	input i1,
  	input i2,
  	input i3,
  	input s0,
  	input s1,
  
  	output reg out
);
  
    always@(s1 or s2 or i0 or i2 or i3) begin
      case({s1,s0})
      	  2'b00: out = i0;
          2'b01: out = i1;
          2'b10: out = i2;
          2'b11: out = i3;
          default: out = 1'bx;
      endcase
    end
endmodule

可以简单总结出,数据流建模要清晰地写出数据之间的表达式关系,而行为级建模更像是C语言的思维,根据输入数据直接给出输出数据。