Verilog基础一基本要素(1)VerilogHDL与VHDL1.它于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:连线和三态线网,可描述多个驱动源驱动同一线网类型,具体值由下表决定:wire01xz00xx01x1x1xxxxxz01xz2.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:一个标量输出多个标量输入,门共有:andorxornandnorxnor2.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)非阻塞性过程赋值在时钟拍开始时刻计算右边表达式的值,在时钟拍结束时刻赋值给左边表达式,即在计算结果和更新变量期间可以计算其他语句表