Verilog 学习日志#第二天

wuchangjian2021-11-04 23:23:53编程学习

模块的描述方式又称建模方式,Verilog既是一门行为化又是一门结构化的HDL语言。根据设计需要,每个模块分为四种抽象级别来进行描述。模块在外部环境中表现是相等的,模块按照以下四类抽象类别进行描述。

模块的描述方式

  • 行为级或算法级描述方式(行为级建模)
  • 数据流描述方式(数据流级建模)
  • 门级描述方式(门级建模)
  • 开关级描述方式(开关级建模)
  • 描述方法总结

行为级或算法级描述方式(行为级建模)

这是Verilog HDL最高抽象级别的描述方式。一个模块可以按照设计算法来实现,而不用关心硬件实现的细节。 行为描述是通过行为语句来实现的,行为功能可使用下述过程语句结构描述。

  • initial 语句:此语句只执行一次
  • always语句:此语句循环执行

只有寄存器类型数据能够在这两种语句中被赋值。寄存器类型数据在被赋新值前保持原值不变。所有的initial语句和always语句在零时刻并发执行。

下面是一个4bit的二进制行波计数器(带进位)为例来说明行为级的描述方式。
4bit 二进制行波计数器电路示意图该计数器由4个T触发器级联而成的,每一级T触发器的输出作为下一级T触发器的时钟输入。下例是用行为级描述方式来实现计数器的一个例子。

module cnt_4bit (q,clear,clock);
	output [3:0] q;
	input clear,clock;

	reg [3:0] q;

	always @(posedge clear or negedge clock)
	begin
		if (clear)
			q=4'd0;
		else
			q=(q+1) % 16;
	end
endmodule

模块cnt_4bit的输出端口q是一个4bit的位矢量,代表4根输出端口线q[3]、q[2]、q[1]、q[0]。由于输出端口要在always语句中被赋值,所以它被定义为reg型(寄存器型)数据。clear和clock是两个输入端口。Always语句中包含一个或事件控制(紧跟在字符@后面的表达式),以及相关联的顺序过程(begin-end对)。此或事件控制的作用是当输入端口clear、clock上发生事件,即clear、clock中某一个值发生变化时,就执行下面的顺序过程。在顺序过程中的语句顺序执行,并在顺序过程结束后被挂起,程序指针返回到或事件控制语句,always语句再次等待clear、clock的值发生变化。这种机制与C++中的消息循环类似。

本例用非常抽象的方式描述了模块要实现的功能,而没有直接指明或者涉及实现该功能的硬件结构,即具体硬件电路的连接结构、逻辑门的组成结构、元件等。

行为描述方式是Verilog这种高级硬件描述语言的一大特色,可以说没有行为级描述就没有Verilog.

数据流描述方式(数据流级建模)

数据流描述方式,也称为RTL(寄存器传输级)描述方式。在这种描述方式下,设计者需要知道数据是如何在寄存器之间传输的以及将被如何处理。数据流描述方式类似于布尔方程,它能够比较直观地表达底层逻辑行为。在 Verilog 中数据流描述方式主要用来描述组合逻辑,具体由连续赋值语句“assign”来实现
下面仍然以图1-3的4bit二进制行波计数器为例,根据自顶向下(Top-Down)的设计方法,用数据流描述的方式来实现它。

第一步,设计顶层模块cnt_4bit_1,代码包含了4个T触发器块T_ff实例(模块调用)。

module cnt_4bit_1 (q.clear,clock);
	output [3:0] q;
	input clear,clock;

	T_ff tff0(q[0], clear, clock);
	T_ff tff1(q[1], clear, q[0]);
	T_ff tff2(q[2], clear, q[1]);
	T_ff tff3(q[3], clear, q[2]);
endmodule

第二步,设计T_ff触发器模块,该模块又包含了其下一层的D触发器模块edge_dff实例。

module T_ff(q,clear,clock);
	output q;
	input clear,clock;

	edge_dff ff1(q, ,~q,clear,clock);
endmodule

注意:在代码中用数据流操作符“~”对信号q取反,而不是用 Verilog 内建基本门级元件not,但是两者最终实现的功能完全相同。
语句 edge_dff1(q, ,~q,clear,clock)中的空格表示默认调用,但是“,”分隔符不能少。

第三步,运用数据流描述语句设计最底层模块负边沿触发D触发器edge_dff。如图所示为该D触发器的基本门级结构。

module edge_dff(q,qbar,d, clear,clock);
	output q,qbar;
	input d,clear,clock;
	
	wire s,sbar,r,rbar,cbar;

assign cbar=~clear;
//输入锁存器:锁存器是电平敏感的。而一个边沿敏感的触发器需要3个RS锁存器来实现。
assign q=~(s&qbar),
		qbar=~(q&r&cbar);
endmodule

负边沿触发D触发器
在这一步的模块edge_dff中,s、sbar、r、rbar、cbar被定义为wire(连线)型数据,wire也是Verilog 的关键字。在其后的代码中使用assign语句对模块的输入、输出端口和连线型数据之间的数据流传输关系进行了描述。这就是Verilog 中的数据流描述方式。

门级描述方式(门级建模)

在这种描述方式下,模块是按照逻辑门和它们之间的互连来实现的。在这种抽象级别下的设计与按照门级逻辑图来描述一个设计类似。具体地讲,门级描述方式就是指调用Verilog 内建的基本门级元件来对硬件电路进行结构设计。这些基本的门级元件是一类特殊的模块,共有14种,分为四类,它们是由Verilog HDL语言自身提供的,不需要用户事先定义就可以在设计中被直接调用。

下面仍然以上例中的行波计数器为例,其第三步的模块edge_dff 的设计可以采用门级描述的方式来实现。根据上图所示的逻辑图,以门级描述的方式来实现它,具体如下例所示。

module edge_dff_1 (q,qbar,d, clear,clock);
	output q,qbar;
	input d,clear,clock;
	wire cbar,clkbar,sbar,s,r,rbar;

	not  N1(cbar,clear),
		 N2(clkbar,clock);
	nand NA1(sbar,rbar,s),
		 NA2(s,sbar,cbar,clkbar),
		 NA3(r,s,clkbar,rbar),
		 NA4(rbar,r,cbar,d),
		 NA5(q,s,qbar),
		 NA6(qbar,q,cbar,r);
endmodule

由本例与数据流级建模第三步对D触发器的两种不同风格的描述来看,数据流风格的描述就像是在列逻辑方程式,而门级描述就像是在画电路原理图,它们都非常直观地表达了D触发器的底层逻辑行为,它们最终实现的D触发器模块的逻辑功能完全相同。

开关级描述方式(开关级建模)

开关级描述方式也称为晶体管级描述方式,是Verilog 最低抽象级别的描述方式。在这种描述方式下,模块是按照开关级元件存储节点以及它们之间的互连来实现的。具体来说,是指调用Verilog 内建的基本开关级元件来对硬件电路进行结构设计。与门级元件类似,这些基本的开关级元件也是一类特殊的模块,共有12种,它们也是由Verilog HDL语言自身提供的,不需要用户事先定义就可以在设计中被直接调用。由于有了这一级别的描述方式,使得用户在MOS ( Metal-Oxide Semiconductor 金属氧化物半导体)晶体管级进行设计成为可能。这一点也正是Verilog HDL 语言的一大优点,而要在其他的HDL语言比如 VHDL 中进行晶体管级设计是非常困难的。然而,随着电路规模的日渐庞大(上百万门晶体管〉和EDA工具的高速发展,在极少数情况下,设计者才可能选择在晶体管级进行电路设计。下面以一个简单的例子对开关级描述方式进行介绍。

尽管Verilog有内建的基本门级元件,比如 nor门,但是现在我们可以使用CMOS(互补金属氧化物半导体)开关元件设计我们自己的nor 门。nor门的门级和开关级逻辑示意图如图所示
nor门的门级和开关级逻辑示意图

module my_nor(out,a,b);
	output out;
	input a,b;
	wire c;
	
	supply1 pwr;
	supply0 gnd;
	pmos(c,pwr,b);
	pmos(out,c,a);
	nmos(out,gnd,a);
	nmos(out,gnd,b);
endmodule

程序中的 supply1、supply0是Verilog 的关键字,分别定义电路的电源和地。pmos.nmos都是Verilog的基本开关级元件。

描述方法总结

以上介绍了Verilog 四种抽象级别的描述方式。事实上,设计者可以在一个设计中混合使用这四种描述方式。如果一个设计包含四个模块,那么每一个模块可以分别用不同抽象级别的描述方式来实现。从设计的成熟性上考虑,大多数模块都可以转化为门级描述来实现。

通常,描述方式越抽象,设计的灵活性和技术独立性也越强。而越靠近开关级的描述方式。对技术的依赖性也越强,设计本身也就越不灵活,一个小改动就可能导致整个设计的大改变。这一点与用C语言和汇编编程相似:用更高级的语言(比如C)进行编程更容易,而且也更容易移植到不同的机器上;相反,如果用汇编语言编程,那么程序是针对某种特定的机器,要移植到其他机器上则很困难。

对于数据流级描述方式(RTL级描述方式),从本质上说,它是对线网型变量的行为进行了描述,因此将这种数据流描述方式归类于行为级描述方式。对于门级和开关级描述方式,由于它们都是根据电路的硬件结构特点进行设计,这里将这两种描述方式归类于结构级描述方式。至此,Verilog 语言分为三大类描述方式,即行为级描述方式、结构级描述方式以及它们之间的混合描述方式。

相关文章

企业更青睐赞助内容,软文将成营销新趋势

      纽约时报近日刊载文章称,在越来越难以通过传统的在线广告赚钱的形...

R语言实战小案例-画相关矩阵图案例

R语言实战小案例-画相关矩阵图案例

前言 本期使用R语言内置数据集进行练习;查看R包含哪些内置数据,请使用“data()”...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。