Verilog基础.docx
- 文档编号:8763874
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:26
- 大小:30.78KB
Verilog基础.docx
《Verilog基础.docx》由会员分享,可在线阅读,更多相关《Verilog基础.docx(26页珍藏版)》请在冰豆网上搜索。
Verilog基础
Verilog基础
一基本要素
(1)VerilogHDL与VHDL
1.它于1995年成为IEEE标准,即standard1364-1995。
VHDL于1987年成为IEEE标准。
2.类C语言,不允许自定义数据类型(VHDL可以)。
3.可描述开关级电路模型,但信号初值不确定,必须由程序初始化;VHDL系统数据定义后没有赋值则默认为0,对系统级支持能力要强一些。
(2)IC设计流程:
系统结构设计与仿真——>HDL设计——>TestBench功能模拟测试、逻辑仿真——>综合成逻辑门(工艺库、约束文件)——>初步时序分析(静态、电压、温度)——>自动布线布局——>后端报告(布局布线后增加的电阻、电容)——>动态(布局后)时序仿真,任何的建立例外都必须通过优化产生该例外的路径,以减小延迟;任何保持例外都必须通过在产生例外的路径上增加缓存,来增加延迟——>逻辑验证——>投片生产。
(3)标识符与关键字命名
1.标识符首字不能为数字或$,可以为字母和下划线,
2.命名长度不能超过1024,
3.区分大小写(与VHDL不同);
4.系统任务和系统函数前必须在标识符前加上$。
5.转义标识符\开头,以空格、制表符(tab键)或换行符结尾,可显示打印ASCII字符。
(4)系统任务和系统函数
1.display(信息输出到标准输出设备,带行结束符)和write(输出信息不带行结束符)。
用于显示输出的特殊字符:
\\n 换行
\\t 制表符
\\\\ 字符\\\
\\" 字符"
\\ddd 值为十六进制字符
%% 字符%
格式定义:
%h或%H:
十六进制
%d或%D:
十进制
%o或%O:
八进制
%b或%B:
二进制
%c或%C:
ASCII字符
%v或%V:
线网信号长度
%m或%M:
层次名
%s或%S:
字符串
%t或%T:
当前时间格式
缺省如$displayb:
显示二进制数,
2.monitor监控和显示指定任务的参数值,
3.strobe显示数据,保证数据只在所有赋值语句执行完毕时才被显示;(而$display()任务执行通常是确定的)。
4.文件输入输出
a.文件打开和关闭:
系统函数$fopen()和$fclose(),
b.输出值到文件:
$fdisplay,$fwrite,$fstrobe,$fmonitor,这些任务的第一个参数都是文件指针,其余参数为带有从参数表的格式定义序列。
c.从文件中读出数据并载入存储器:
$readmemb,$readmenh用于指定文件中读取并载入数据到指定的存储器。
可在模拟时间的任何时刻执行,读取的文件只能包含如下内容:
空格、换行符、制表符(tab键)、换页;注释;二进制和十六进制;
5.模拟时间访问当前模拟时间,
a.$time:
返回64位的整型模拟时间值,由`timescale激活;
b.$stime:
返回32位无负号整型时间值,在`timescale中指定单位,
c.$realtime:
返回一个实数,在`timescale中指定单位;
6.模拟控制
a.$finish[(n)];使模拟器窗口关闭并控制返回主机操作系统;
b.$stop[(n)];将模拟进程挂起;
7.随机函数$random[(seed)];
产生随机数,每次调用时根据种子变量(seed)的取值返回一个新的32位有符号随机数。
种子变量必须是寄存器型、整型或时间寄存器型,种子变量来控制函数返回值,改变量的值应该在调用$random系统函数之前就已定义好。
其他产生随机数函数:
$dist_uniform(seed,start,end);
$dist_normal(seed,mean,standard_deviation,upper);
$dist_exponential(seed,mean);
$dist_poisson(seed,mean);
$dist_chi_square(seed,degree_of_freedom);
$dist_t(seed,degree_of_freedom);
$dist_erlang(seed,k_stage,mean);
(5)编译指令
1.`difine,`undef,产生/取消文本替换的宏;
2.`ifdef,`else,`endif,条件编译;
3.`default_nettype,为隐式线网指定线网类型,在模块外使用,影响其后的所有模块;线网类型的关键字有:
wire,tri,tri0,wand,triand,tri1,wor,trior,trireg;
4.`include,包含源文件,可以嵌套,如果文件1包含文件2,文件2包含文件3,则在文件1中用2条该指令包含且文件3出现在前;
5.`resetall,重设为缺省值;
6.`timescale,说明时间单位和精度,$printtimescale显示模块的时间单位和精度;
7.`unconnected_drive,`nounconnected_drive,出现在这两个指令之间的任何未连接的输入端口呈现为正偏电路状态(连接到高电平)或反偏电路状态(连接到低电平)。
8.`celldefine,`endcelldefine,这两个指令之间为单元模块。
(6)空白符和注释
空格、制表符、换行符、走纸符没有特殊意义;
注释形式多行或单行用//,
(7)数值和字符串
1. 4种基本值:
0,1,x未知,z高阻;x和z不区分大小写;
2. 3种基本常量:
整型,实型,字符串型;八进制(o或O),二进制(b或B),十进制(d或D),十六进制(h或H);科学计数法,2_3.5e2值为2350.0忽略下划线;字符串在双引号内,不能分多行写;
(8)线网类型
1.wire和tri:
连线和三态线网,可描述多个驱动源驱动同一线网类型,具体值由下表决定:
wire 0 1 x z
0 0 x x 0
1 x 1 x 1
x x x x x
z 0 1 x z
2.wor和trior:
线或线网;
3.wand和triand:
线与网;
4.trireg:
三态寄存器,用于存储数值,并可用于电容节电建模;
5.tri0和tri1线网:
用于线逻辑的建模,若无驱动源驱动,则tri0的值为0(tri1的值为1);
6.supply0和supply1:
前对地建模,电平为0;后者对电源建模,即高电平1;
(9)寄存器类型
1.reg:
可以取任意长度,值通常被解释为无符号数;
2.integer:
整型值,最多容纳32位;可以存储有符号数,且算术操作符提供2的补码运算结果;不能位访问,一种截取位的办法是将整数赋值给一般的reg型变量,然后从中选取相应的位,综从右向左截取(获得最低位),多余的(高位)被截断;
3.time:
存储和处理时间,只存储无符号值,默认为64位值;
(10)门类型
1.and/or:
一个标量输出多个标量输入,门共有:
and or xor
nand nor xnor
2.buf/not:
一个标量输入和多个标量输出;
(11)操作符
优先级:
由高到低,
!
(逻辑非),
&,~&,|,~|,^,~^,规约操作符在单一操作数的所有位上进行操作,并产生1位结果;
+,-,正负;
*,/(只取整,余数丢弃),%(求余数,两侧均为整型);
+,-,加减;
<<,>>,移位操作,空位补0,
>,<,>=,<=,
==,!
=,===(等于),!
==(不等于);
&,~&,~,^(按位异或),^~(同或),位运算操作,右端对齐;
|,~|,
&&(逻辑与),
||,逻辑操作,
?
:
条件操作,
{},连接操作,可把多个信号的某些位连接起来进行位运算操作表示一个新信号,还可以嵌套;
=,<=,赋值,
复制操作符,{重复数字{重复内容}};
二行为建模与基本的行为建模语句
1.过程语句
并发执行,时序条件或事件触发。
每个模块中可以含任意个initial和always语句,块内部可顺序执行,块间的语句可以交叉执行。
较适合的做法是在always语句中描述硬件行为,在年语句中模块初始化。
(a)initial:
在仿真开始时,且该块仅执行一次,常用于测试和虚拟模块中,多个initial语句之间并行;可以是下列语句之一:
assign //阻塞或非阻塞过程赋值语句
continous //连续赋值语句
conditioal //条件语句
case //case语句
loop //循环
wait //等待
disable //终止
sequential //顺序执行块
parallel //并行执行块
task //任务使能语句
(b)always[@(timing_control)]:
循环执行,触发条件由时序控制决定,可以电平触发也可边沿触发(negedge,posedge),还可以多个信号用or连接,满足条件才执行,否则阻塞并等待再次满足条件,所以输入的变化会影响输出;可用语句与initial类似;缺省条件则产生一个仿真死锁。
边沿触发常用于描述时序行为,如有限状态机等;电平触发常用来描述组合逻辑行为。
2.条件语句
(a)if()elseif()else;
(b)条件操作符(?
:
)二选一;
3.caseendcase语句
多分支枚举选择,表达式长度要统一。
派生的casez和casex语句,在casex句中值x(未知)和z(高阻)都被认为是无关位,if句中表达式产生的x或z值将出错;在casez句中值z被认为是无关值。
如casez(mask)4`b1?
?
?
:
Dbus[4]=0;表示第4位是1忽略其他位。
4.循环语句
(a)forever:
连续执行,跳出语句disable可与过程语句同使用;
(b)repeat():
执行固定次数,计数表达式值X或z不定是,按0处理;
(c)while():
执行过程赋值语句直到指定的条件为假,如果表达式开始就假,则不执行;
(d)for:
(e)循环的异常退出:
disable,可退出任何循环,能终止任何begin_end块的执行,块名可放在begin关键字后冒号后。
5.事件控制
在verilog2001新规范中@(a,b,c)和@(aorborc)等价,
(a)边沿触发事件@event:
posedge和negedge表示上升沿转换的形式有:
0->x,0->z,0->1,x->1,z->1;
下降沿转换形式有:
1->z,1->x,1->0,x->0,z->0;
(b)电平触发事件wait()
6.持续赋值
赋值给预先定义好的网线,在模拟期间只要且只有等式右边有变化,就赋值给左边,且连续、自动完成;若有指定赋值延迟,则在右边变化后过一定延迟时间再赋值给左边;用于数据流行为建模,常用在组合逻辑设计。
assigna=b;
7.过程赋值语句
用来更新寄存器型、整型、时间型和存储器型变量;与持续赋值的区别:
一,在过程控制流下控制更新寄存器变量;assign驱动线网,且在输入操作值变化时求解新值并更新变量;
二,在过程块内部;assign句在过程块外步;
三,通常用在initial和always块中,只能对寄存器型变量赋值;
·通常在always块中用阻塞性赋值来产生组合逻辑;
·通常在always块中用非阻塞性赋值来产生时序逻辑;
(a)verilogHDL的层次化事件模型:
IEEE标准中四个独立层次化事件队列:
动态事件队列
停止运行的事件队列()顺序可变:
阻塞赋值,计算非阻塞赋值右边的表达式,持续赋值,执行$display命令,计算原语的输入和输出变化;
非阻塞事件队列:
#0延迟阻塞赋值;
监控事件队列:
更新非阻塞赋值语句左边变量的值;
其他指定的PLI命令队列:
执行$monitor命令,$strobe命令;
所有事件可以加入到任何一个事件队列中,但只能从活跃事件队列中移出。
8条可综合风格的VerilogHDL编码规则(尽量避免条件竞争):
·时序逻辑建模使用非阻塞赋值;
·锁存器建模使用非阻塞赋值;
·在always块中组合逻辑建模使用阻塞赋值;
·在同一个always块中对时序逻辑和组合逻辑同时建模使用非阻塞赋值;
·不要在同一个always块中混和使用阻塞和非阻塞赋值;
·不要在多个always块中对同一个变量赋值;
·使用$strobe命令显示对非阻塞语句进行的赋值;
·不要使用零延迟赋值语句。
(b)阻塞性过程赋值
必须在顺序块中后续语句执行前执行完毕,但不能阻止并行块中后续语句执行;如:
regy1,y2;
y1=0;y2=1;
(c)非阻塞性过程赋值
在时钟拍开始时刻计算右边表达式的值,在时钟拍结束时刻赋值给左边表达式,即在计算结果和更新变量期间可以计算其他语句表达式的值并更新,就是非阻塞赋值语句不阻塞其他语句的执行。
那么各条非阻塞语句各自独立,并行执行,不会阻塞其他语句执行。
"<="为非阻塞赋值符号,例:
regx1,x2;x1<=9;x2=5;
非阻塞赋值语句只能对寄存器操作,因此只能在过程块(initial和always)内部实现。
如果时序逻辑和组合逻辑同时在一个always块中出现,常用非阻塞赋值,把这个always块当作时序逻辑来处理。
单独阻塞赋值表示的组合逻辑和单独非阻塞赋值表示的时序逻辑混合,例如:
moduleex1(q,a,b,clk,rst_n);
outputq;
inputclk,rst_n,a,b;
regq,y;
always@(aorb)
y=a^b;
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
q<=1`b0;
else
q<=y;
endmodule
建议在所有的时序逻辑编码中使用非阻塞赋值。
三 结构化建模
1.三种示例化描述
结构级描述是在门级或更高级的层次上描述数字系统,有三种示例化的语句来描述:
·原语(primitive)示例,即逻辑门;
·用户自定义基元(UDP)示例,逻辑门的一种扩展;
·模块(module)示例。
VerilogHDL定义了14种原语,分4大类:
多输入门、多输出门、三态门和pull门。
不能在一个module内部定义UDP,要在其外面,但UDP只能有一个输出,且输入中不能出现总线结构。
模块比UDP更灵活,可支持任意复杂和任意端口数目,所有实际结构化描述中常用模块化的结构级描述。
2.模块
(1)三种端口:
input、output、inout;缺省的端口型默认为wire型,类型声明的长度必须与端口声明的长度一致。
定义与例化一致。
(2)使用参数定义语句,使模块定义内含参数,
(3)示例化说明,使模块定义内含参数,
(4)实例设计,分行为级、数据流、门级和开关级四种设计;示例化是建立在模块定义基础上,一次模拟中至少有两个模块,设计模块和测试模块;测试模块一般是顶层模块,并且一般用行为级描述。
循环计数器顶层:
modulecarry_counter4(q,clk,reset);
output[3:
0]q;
inputclk,reset;
//4instancesofthemoduleT_FFarecreated
T_FFtff0(q[0],clk,reset);
T_FFtff1(q[1],q[0],reset);
T_FFtff2(q[2],q[1],reset);
T_FFtff3(q[3],q[2],reset);
endmodule
用到的T型触发器:
moduleT_FF(q,clk,reset);
outputq;
inputclk,reset;
wired;
D_FFdff0(q,d,clk,reset);
notn1(d,q);//非门
endmodule
用到的带同步复位的D触发器:
moduleD_FF(q,d,clk,reset);
outputq;
inputd,clk,reset;
always@(posedgeresetornegedgeclk);
if(reset)
q<=1'b0;
else
q<=d;
endmodule
测试模块:
modulestimulus;
regclk,reset;
wire[3:
0]q;
//计数器例化
carry_counter4r1(q,clk,reset);
//生成时钟
initial
clk=1'b0;
always
#5clk=~clk;//主频100Hz?
//输入激励控制信号
//0ns--15ns复位
initial
begin
reset=1'b1;
#15reset=1'b0;
#180reset=1'b1;
#10reset=1'b0;
#20$finish;//模拟结束
end
//监视输出
initial
$monitor($time,"Outputq=%d",q);
endmodule
四门级与开关级建模
行为级、寄存器传输级、门级、开关级建模针对系统的不同层次。
VerilogHDL提供了18个门级和开关级的基本基元,设计使用时只要例化并用线网连接起来即可。
门级基元 开关级基元
多输入门 多输出门 三态门 MOS开关 双向开关
and buf bufif0 nmos tran
nand not bufif1 pmos tranif0
or notif0 cmos tranif1
nor notif1 rnmos rtran
xor rpmos rtranif0
xnor rcmos rtanif1
1.三类门级基元12种
多输出门buf和not门,在加上控制信号后成为三态门,
2.开关级基元14种
是实际的MOS关的抽象表示,分电阻型(前缀r表示)和非电阻型;
(1)MOS开关
·nmos开关:
控制信号高,开关导通,否则关闭;
·pmos开关:
控制信号低,开关导通,否则关闭;
·cmos开关:
模拟了nmos和pmos开关的组合,一般ncontrol和pcontrol是互补信号:
coms实例名(out,data,ncontrol,pcontrol);
(2)双向开关:
MOS开关只提供了单向驱动能力,双向开关的每个脚都声明为inout类型,可做输入驱动或输出被驱动,即可以互相驱动且随时保持一致。
无条件双向开关tran和有条件双向开关tranif0(只有当conrol为0时两端互相驱动)、tranfi1(当control为1时两端互相驱动):
tranifx实例名(inout1,inout2,control);
3.门级建模
实际电路中逻辑门都有一定延迟,提供3种延迟:
·上升延迟(risedelay):
门的输出态从(0、x、z)到1的所需时间;
·下降延迟(falldelay):
门的输出态从(1、x、z)到0的所需时间;
·关断延迟(turnoffdelay):
三态门的输出从(0、1、x)到高阻态z所需时间。
门级建模:
穷举输入输出->卡诺图->布尔函数,布尔函数的自变量就是逻辑门的输入。
四位全加器例:
一位全加器布尔函数为sum=(a^b^cin);cout=ab+cin(a^b);门级建模:
modulefulladd(sum,c_out,a,b,c_in);
outputsum,c_out;
inputa,b,c_in;
//internalnets
wires1,c1,c2;
//instantiatelogicgateprimitive
xor(s1,a,b);
and(c1,a,b);
xor(sum,s1,c_in);
and(c2,s1,c_in);
xor(c_out,c1,c2);
endmodule
四位并行全加器:
modulefulladd4(sum,c_out,a,b,c_in);
output[3:
0]sum;
outputc_out;
input[3:
0]a,b;
inputc_in;
wirec1,c2,c3;
fulladdfa0(sum[0],c1,a[0],b[0],c_in);
fulladdfa1(sum[1],c2,a[1],b[1],c1);
fulladdfa0(sum[2],c3,a[2],b[2],c2);
fulladdfa0(sum[3],c_out,a[3],b[3],c3);
endmodule
4.开关级建模
表示开关导通与关断,还表示连接开关的线网上存储电荷的容量,即线网的强度,声明开关示例连接时在声明说明后注明等级即可;定义的8种强度等级:
强度名称 强度等级 声明说明 打印缩写
Supplydrive 7 Supply Su
Strongdrive 6 Strong St
Pulldrive 5 Pull Pu
Largecapacitor 4 Large La
Weakdrive 3 Weak We
Mediumcapacitor 2 Medium Me
Smallcapacitor 1 Small Sm
Highimpedance 0 Highz Hi
使用%v格式可打印出来。
为了模拟实际电路中晶体管开关自身带有电阻,就用电阻型开关表示(名字中带有r的开关),但驱动强度相应降低。
通过电阻型开关后强度降低幅度表
输入强度 输出强度
Supply Pull
Strong Pull
Pull Weak
Large Medium
Weak Medium
Med
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Verilog 基础