资源描述
第第7章章 Verilog行为语句行为语句 主要内容主要内容 过程语句(过程语句(过程语句(过程语句(initialinitial、alwaysalways)块语句(块语句(块语句(块语句(begin-endbegin-end、fork-joinfork-join)赋值语句(赋值语句(赋值语句(赋值语句(assignassign、=、=)条件语句(条件语句(条件语句(条件语句(if-elseif-else、casecase、casezcasez、casexcasex)循环语句(循环语句(循环语句(循环语句(forfor、foreverforever、repeatrepeat、whilewhile)编编编编译译译译指指指指示示示示语语语语句句句句(definedefine、includeinclude、ifdefifdef、elseelse、endifendif)任务(任务(任务(任务(tasktask)与与与与 函数(函数(函数(函数(functionfunction)顺序执行与并发执行顺序执行与并发执行顺序执行与并发执行顺序执行与并发执行Verilog HDL行为语句行为语句类别类别语句语句可综合性可综合性过程语句过程语句initialalways块语句块语句串行块串行块begin-end并行块并行块fork-join赋值语句赋值语句持续赋值持续赋值assign过程赋过程赋值值=、=条件语句条件语句if-elsecase循环语句循环语句forrepeatwhileforever编译向导语句编译向导语句defineincludeifdef,else,endif7.1 过程语句过程语句 initial always在在一一个个模模块块(module)中中,使使用用initial和和always语语句句的的次次数数是是不不受受限限制制的的。initial语语句句常常用用于于仿仿真真中中的的初初始始化化,initial过过程程块块中中的的语语句句仅仅执执行行一一次次;always块块内内的的语语句句则则是不断重复执行的。是不断重复执行的。always过程语句使用模板过程语句使用模板always()begin/过程赋值过程赋值/if-else,case,casex,casez选择语句选择语句/while,repeat,for循环循环/task,function调用调用end“always”过程语句通常是带有触发条件的,触发条件写过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时,其后的在敏感信号表达式中,只有当触发条件满足时,其后的“begin-end”块语句才能被执行。块语句才能被执行。敏感信号表达式敏感信号表达式“event-expression”敏敏感感信信号号表表达达式式又又称称事事件件表表达达式式或或敏敏感感信信号号列列表表,即即当当该该表表达达式式中中变变量量的的值值改改变变时时,就就会会引引发发块块内内语语句句的的执执行行。因因此此敏敏感感信信号号表表达达式式中中应应列列出出影影响响块块内内取取值值的的所所有有信信号号。若若有两个或两个以上信号时,它们之间用有两个或两个以上信号时,它们之间用“or”连接。连接。例如:例如:(a)a)/当信号当信号a a的值发生改变的值发生改变(a or b)a or b)/当信号当信号a a或信号或信号b b的值发生改变的值发生改变(posedge clock)posedge clock)/当当clock clock 的上升沿到来时的上升沿到来时(negedge clock)negedge clock)/当当clock clock 的下降沿到来时的下降沿到来时(posedge clk or negedge reset)posedge clk or negedge reset)/当当clkclk的上升沿到来或的上升沿到来或resetreset信号的下降沿到来信号的下降沿到来敏感信号列表举例(敏感信号列表举例(4选选1数据选择器)数据选择器)module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel;reg out;always(in0 or in1 or in2 or in3 or sel)/敏感信号列表敏感信号列表case(sel)2b00:out=in0;2b01:out=in1;2b10:out=in2;2b11:out=in3;default:out=2bx;endcaseendmoduleposedge和和negedge关键字关键字对对于于时时序序电电路路,事事件件通通常常是是由由时时钟钟边边沿沿触触发发的的,为为表表达达边边沿沿这这个个概概念,念,Verilog提供了提供了posedge和和negedge关键字来描述。比如:关键字来描述。比如:【例】同步置数、同步清零的计数器【例】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output7:0 out;input7:0 data;input load,clk,reset;reg7:0 out;always(posedge clk)/clk上升沿触发上升沿触发 begin if(!reset)out=8h00;/同步清同步清0,低电平有效,低电平有效 else if(load)out=data;/同步预置同步预置 else out=out+1;/计数计数 endendmodule7.2 块语句块语句块语句通常用来将两条或多条语句组合在一起,使其在格式上看更像一条语句。begin_end语句:用来标示顺序执行的语句,顺序块fork_join 语句:用来标示并行执行的块,并行块1)顺序块顺序块 由关键词由关键词begin开始,开始,end结束结束顺顺序序块块中中的的语语句句是是一一条条一一条条执执行行,只只有有前前面面的的语语句句执执行行完完后后,后面的语句才能执行(内嵌套延迟和非阻塞赋值除外)。后面的语句才能执行(内嵌套延迟和非阻塞赋值除外)。如如果果语语句句中中包包含含有有延延迟迟或或事事件件控控制制,那那么么延延迟迟总总是是相相对对于于上上一一条语句完成的时间的。条语句完成的时间的。例 begin b=a;c=b;end例 begin b=a;#10 c=b;endinitialb e g i n#2 S t r e a m=1;#5 S t r e a m=0;#3 S t r e a m=1;#4 S t r e a m=0;#2 S t r e a m=1;#5 S t r e a m=0;e n d若仿真开始时间为若仿真开始时间为10单位单位2)并行块并行块 由关键词fork,join声明块内语句并发执行块内语句并发执行语句执行的顺序是由各语句的延迟和事件控制决定的。语句执行的顺序是由各语句的延迟和事件控制决定的。语语句句中中的的延延迟迟和和事事件件控控制制是是相相对对于于语语句句的的开开始始执执行行时时间间决决定的。定的。并并行行块块和和顺顺序序块块之之间间的的根根本本区区别别在在于于:所所有有的的语语句句同同时时开开始执行,语句的先后顺序无关紧要。始执行,语句的先后顺序无关紧要。initialf o r k#2 S t r e a m=1;#7 S t r e a m=0;#10 S t r e a m=1;#14 S t r e a m=0;#16 S t r e a m=1;#21 S t r e a m=0;j o i n若仿真开始时间为若仿真开始时间为10单位单位例:例:3)嵌套块)嵌套块块可以嵌套使用,块可以嵌套使用,顺序块顺序块和和并行块并行块可以混合使用。可以混合使用。/嵌套块嵌套块initialinitialbeginbegin x=1b0;x=1b0;forkfork#5 y=1b1;#5 y=1b1;#10 z=x,y;z=x,y;joinjoin#20 w=y,x;w=y,x;endend4)命名块命名块块可以有名字,我们称之为块可以有名字,我们称之为命名块命名块。命名块内可以声明局部变量;命名块内可以声明局部变量;命命名名块块是是设设计计的的一一个个层层次次,其其声声明明的的变变量量可可以以通通过过层层次次名名引引用访问;用访问;命名块可以被禁止;命名块可以被禁止;disable 块名块名/命名块命名块a l w a y sb e g i n:S E Q _ A#4 D r y=5;#8 B a x=1;end5)起始时间和结束时间起始时间和结束时间对于顺序块:对于顺序块:起始时间:第一条语句开始被执行的时间。起始时间:第一条语句开始被执行的时间。结束时间:最后一条语句执行完的时间。结束时间:最后一条语句执行完的时间。对于并行块:对于并行块:起始时间:程序流程控制进入该块的时间,对块内各语句起始时间:程序流程控制进入该块的时间,对块内各语句 是相同的。是相同的。结束时间:按时间排序在最后的语句执行结束的时间。结束时间:按时间排序在最后的语句执行结束的时间。7.3 赋值语句赋值语句1、持续赋值语句(、持续赋值语句(Continuous Assignments)assign为持续赋值语句,主要用于对为持续赋值语句,主要用于对wire型变量的赋值。型变量的赋值。比如:比如:assign c=a&b;在上面的赋值中,在上面的赋值中,a、b、c三个变量皆为三个变量皆为wire型变量,型变量,a和和b信号的任何变化,都将随时反映到信号的任何变化,都将随时反映到c上来。上来。2、过程赋值语句(、过程赋值语句(Procedural Assignments)过程赋值语句多用于对过程赋值语句多用于对reg型变量进行赋值。过程赋值有阻塞型变量进行赋值。过程赋值有阻塞(blocking)赋值和非阻塞(赋值和非阻塞(non_blocking)赋值两种方式。赋值两种方式。(1)非阻塞()非阻塞(non_blocking)赋值方式赋值方式 赋值符号为赋值符号为“=”,如:如:b=a;非阻塞赋值在整个过程块结束时才完成赋值操作,即非阻塞赋值在整个过程块结束时才完成赋值操作,即b的值并不是立刻的值并不是立刻就改变的。就改变的。(2)阻塞()阻塞(blocking)赋值方式赋值方式赋值符号为赋值符号为“=”,如:如:b=a;阻塞赋值在该语句结束时就立即完成赋值操作,即阻塞赋值在该语句结束时就立即完成赋值操作,即b的值在该条语句的值在该条语句结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前结束后立刻改变。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了面的赋值语句没有完成之前,后面的语句就不能被执行,仿佛被阻塞了(blocking)一样,因此称为阻塞赋值方式。一样,因此称为阻塞赋值方式。阻塞赋值与非阻塞赋值阻塞赋值与非阻塞赋值 非阻塞赋值非阻塞赋值module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always(posedge clk)begin b=a;c=b;endendmodule阻塞赋值阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always(posedge clk)begin b=a;c=b;endendmodule阻塞赋值与非阻塞赋值阻塞赋值与非阻塞赋值非阻塞赋值仿真波形图非阻塞赋值仿真波形图 阻塞赋值仿真波形图阻塞赋值仿真波形图 阻塞赋值与非阻塞赋值阻塞赋值与非阻塞赋值非阻塞赋值综合结果非阻塞赋值综合结果阻塞赋值综合结果阻塞赋值综合结果7.4 条件语句条件语句(if-else语句)语句)if-else语句使用方法有以下语句使用方法有以下3种:种:(1)if(表达式)表达式)语句语句1;(2)if(表达式)表达式)语句语句1;else 语句语句2;(3)if(表达式表达式1)语句语句1;else if(表达式表达式2)语句语句2;else if(表达式表达式3)语句语句3;else if(表达式表达式n)语句语句n;else 语句语句n+1;case语句的使用格式如下。语句的使用格式如下。case(敏感表达式)敏感表达式)值值1:语句语句1;/case分支项分支项 值值2:语句语句2;值值n:语句语句n;default:语句语句n+1;endcasecase语句语句BCD码码七段数码管显示译码器七段数码管显示译码器module decode4_7(decodeout,indec);output6:0 decodeout;input3:0 indec;reg6:0 decodeout;always(indec)begin case(indec)/用用case语句进行译码语句进行译码 4d0:decodeout=7b1111110;4d1:decodeout=7b0110000;4d2:decodeout=7b1101101;4d3:decodeout=7b1111001;4d4:decodeout=7b0110011;4d5:decodeout=7b1011011;4d6:decodeout=7b1011111;4d7:decodeout=7b1110000;4d8:decodeout=7b1111111;4d9:decodeout=7b1111011;default:decodeout=7bx;endcase endendmodule7.5 循环语句循环语句repeat loopinitialbeginfor(i=0;i4;i=i+1)out=out+1;endinitialbeginrepeat(5)out=out+1;endinitialbegini=0;while(i0)i=i+1;endfor loopwhile loop在在Verilog中中存存在在四四种种类类型型的的循循环环语语句句,用用来来控控制制语语句句的的执执行行次次数数。这这四四种语句分别为种语句分别为:(1)forever:连连续续地地执执行行语语句句;多多用用在在“initial”块块中中,以以生生成成时时钟钟等周期性波形。等周期性波形。(2)repeat:连续执行一条语句连续执行一条语句n次。次。(3)while:执行一条语句直到某个条件不满足。执行一条语句直到某个条件不满足。(4)for:有条件的循环语句。有条件的循环语句。for语句语句for语句的使用格式如下(同语句的使用格式如下(同C语言):语言):for(表达式表达式1;表达式;表达式2;表达式;表达式3)语句;)语句;即即:for(循循环环变变量量赋赋初初值值;循循环环结结束束条条件件;循循环环变变量量增增值值)执执行语句;行语句;用用for语句描述的七人投票表决器语句描述的七人投票表决器module voter7(pass,vote);output pass;input6:0 vote;reg2:0 sum;integer i;reg pass;always(vote)beginsum=0;for(i=0;i=6;i=i+1)/for语句语句if(votei)sum=sum+1;if(sum2)pass=1;/若超过若超过4人赞成,则人赞成,则pass=1else pass=0;endendmodulerepeat语句语句 repeat语句的使用格式为:语句的使用格式为:repeat(循环次数表达式)循环次数表达式)语句;语句;或或 repeat(循环次数表达式)循环次数表达式)begin end用用repeat实现实现8位二进制数的乘法位二进制数的乘法 module mult_repeat(outcome,a,b);parameter size=8;inputsize:1 a,b;output2*size:1 outcome;reg2*size:1 temp_a,outcome;regsize:1 temp_b;always(a or b)begin outcome=0;temp_a=a;temp_b=b;repeat(size)/repeat语句,语句,size为循环次数为循环次数beginif(temp_b1)/如果如果temp_b的最低位为的最低位为1,就执行下面的加法,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a1;/操作数操作数b右移一位右移一位endendendmodule7.6 编译指示语句编译指示语句 Verilog允允 许许 在在 程程 序序 中中 使使 用用 特特 殊殊 的的 编编 译译 向向 导导(Compiler Directives)语语句句,在在编编译译时时,通通常常先先对对这这些些向向导导语语句句进进行行“预处理预处理”,然后再将预处理的结果和源程序一起进行编译。,然后再将预处理的结果和源程序一起进行编译。向向导导语语句句以以符符号号“”开开头头,以以区区别别于于其其它它语语句句。Verilog提提供供了了十十几几条条编编译译向向导导语语句句,如如:define、ifdef、else、endif、restall等等。比比较较常常用用的的有有define,include和和ifdef、else、endif等。等。宏替换宏替换define define语语句句用用于于将将一一个个简简单单的的名名字字或或标标志志符符(或或称称为为宏宏名名)来来代替一个复杂的名字或字符串,其使用格式为:代替一个复杂的名字或字符串,其使用格式为:define 宏名(标志符)宏名(标志符)字符串字符串 如:如:define sum ina+inb+inc+inddefine sum ina+inb+inc+ind 在上面的语句中,用简单的宏名在上面的语句中,用简单的宏名sum来代替了一个复杂的表来代替了一个复杂的表达式达式ina+inb+inc+ind,采用了这样的定义形式后,在后面的程采用了这样的定义形式后,在后面的程序中,就可以直接用序中,就可以直接用sum来代表表达式来代表表达式ina+inb+inc+ind了。了。文件包含文件包含include include是是文文件件包包含含语语句句,它它可可将将一一个个文文件件全全部部包包含含到到另另一一个个文件中。其格式为:文件中。其格式为:include “文件名文件名”使用使用include语句时应注意以下几点:语句时应注意以下几点:(1)一个)一个include语句只能指定一个被包含的文件。语句只能指定一个被包含的文件。(2)include语语句句可可以以出出现现在在源源程程序序的的任任何何地地方方。被被包包含含的的文文件件若与包含文件不在同一个子目录下,必须指明其路径名。若与包含文件不在同一个子目录下,必须指明其路径名。(3)文文件件包包含含允允许许多多重重包包含含,比比如如文文件件1包包含含文文件件2,文文件件2又又包包含文件含文件3等。等。1 1)tasktask和和functionfunction的不同点的不同点函数只能与主模块公用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。函数不能启动任务,而任务能够启动其他任务和函数。函数至少要有一个输入变量,而任务可以没有或有多个任意类型的变量。函数返回一个值,而任务则不返回值。7.7 任务与函数任务与函数 task和function说明语句分别用来定义任务和函数。利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数,便于理解和调试。7.7 任务与函数任务与函数 任务(任务(task)任务定义格式:任务定义格式:task;/注意无端口列表注意无端口列表 端口及数据类型声明语句;端口及数据类型声明语句;其它语句;其它语句;endtask任务调用的格式为:任务调用的格式为:(端口(端口1,端口,端口2,);需要注意的是:任务调用时和定义时的端口变量应是一一需要注意的是:任务调用时和定义时的端口变量应是一一对应的。对应的。任务的调用任务的调用:my_task(v,w,x,y,z);其中,其中,(v,w,x,y,z)与任务定义的与任务定义的I/O变量变量(a,b,c,d,e)之间是之间是一一对应关系。一一对应关系。任务定义:任务定义:task my_task;input a,b;inout c;output d,e;c=f1;d=2;end task任务任务能支持多种目的,能计算多个结果值,这些结果只能通过被调用的能支持多种目的,能计算多个结果值,这些结果只能通过被调用的任务的输出或总线端口送出,任务的输出或总线端口送出,适合于描述时序任务适合于描述时序任务。使用任务时,需要注意以下几点:使用任务时,需要注意以下几点:任务的定义与调用须在一个任务的定义与调用须在一个module模块内。模块内。定定义义任任务务时时,没没有有端端口口名名列列表表,但但需需要要紧紧接接着着进进行行输输入入输输出出端口和数据类型的说明。端口和数据类型的说明。当当任任务务被被调调用用时时,任任务务被被激激活活。任任务务的的调调用用与与模模块块调调用用一一样样通通过过任任务务名名调调用用实实现现,调调用用时时,需需列列出出端端口口名名列列表表,端端口口名名的的排序和类型必须与任务定义中的相一致。排序和类型必须与任务定义中的相一致。一一个个任任务务可可以以调调用用别别的的任任务务和和函函数数,可可以以调调用用的的任任务务和和函函数数个数不限。个数不限。例如:例如:函数(函数(function)函数的目的是返回一个值,以用于表达式的计算。函数的目的是返回一个值,以用于表达式的计算。Verilog模块使用函数时,会把它当作表达式中的操作符。函数的模块使用函数时,会把它当作表达式中的操作符。函数的定义格式:定义格式:function 函数名;函数名;端口声明;端口声明;局部变量定义;局部变量定义;其它语句;其它语句;endfunction是一个可选项,如果缺省,则返是一个可选项,如果缺省,则返回值为回值为1位寄存器类型的数据。位寄存器类型的数据。函数举例函数举例function7:0 get0;input7:0 x;reg7:0 count;integer i;begin count=0;for(i=0;i=7;i=i+1)if(xi=1b0)count=count+1;get0=count;endendfunction 上上面面的的get0函函数数循循环环核核对对输输入入数数据据x的的每每一一位位,计计算算出出x中中0的的个数,并返回一个适当的值。个数,并返回一个适当的值。例如:例如:在使用函数时,需要在使用函数时,需要注意注意 函数的定义与调用须在一个函数的定义与调用须在一个module模块内。模块内。函函数数只只允允许许有有输输入入变变量量且且必必须须至至少少有有一一个个输输入入变变量量,输输出出变变量量由由函函数数名名本本身身担担任任,在在定定义义函函数数时时,需需对对函函数数名名说说明其类型和位宽。明其类型和位宽。定定义义函函数数时时,没没有有端端口口名名列列表表,但但调调用用函函数数时时,需需列列出出端端口口名名列列表表,端端口口名名的的排排序序和和类类型型必必须须与与定定义义时时的的相相一一致致。这一点与任务相同这一点与任务相同 函数可以出现在持续赋值函数可以出现在持续赋值assignassign的右端表达式中。的右端表达式中。函函数数不不能能调调用用任任务务,而而任任务务可可以以调调用用别别的的任任务务和和函函数数,且调用任务和函数个数不受限制。且调用任务和函数个数不受限制。函数的定义不能包含任何时间控制语句,即任何用函数的定义不能包含任何时间控制语句,即任何用#、或或waitwait来标示的语句。来标示的语句。任务与函数的比较任务与函数的比较 7.8 顺序执行与并发执行顺序执行与并发执行两个或更多个两个或更多个“always”过程块、过程块、“assign”持续赋持续赋值语句、实例元件调用等操作都是同时执行的。值语句、实例元件调用等操作都是同时执行的。在在“always”always”模块内部,其语句如果是非阻塞赋值,模块内部,其语句如果是非阻塞赋值,也是并发执行的;而如果是阻塞赋值,则语句是按照也是并发执行的;而如果是阻塞赋值,则语句是按照指定的顺序执行的,语句的书写顺序对程序的执行结指定的顺序执行的,语句的书写顺序对程序的执行结果有着直接的影响。果有着直接的影响。顺序执行的例子顺序执行的例子顺序执行模块顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always(posedge clk)begin q=q;a=q;endendmodule顺序执行模块顺序执行模块2module serial2(q,a,clk);output q,a;input clk;reg q,a;always(posedge clk)begin a=q;q=q;endendmodule顺序执行顺序执行顺序执行模块顺序执行模块1 1仿真波形图仿真波形图 顺序执行模块顺序执行模块2 2仿真波形图仿真波形图 顺序执行模块顺序执行模块1 1综合结果综合结果顺序执行模块顺序执行模块2 2综合结果综合结果系统函数和任务系统函数和任务Verilog定义了一些函数和任务,每个系统函数和任务前面都有一个标识符$来加以确认,这些函数和任务提供了强大的功能。常用的系统任务和函数有下面几种:1)$time /找到当前的仿真时间2)$display,$monitor /显示和监视信号值的变化3)$stop /暂停仿真4)$finish /结束仿真5)-$符号表示符号表示 Verilog 的系统任务和函数的系统任务和函数1$display函数函数用来输出信息用来输出信息$display(“rval=%h hex%d decimal”,rval,rval)例如例如提供了监控和输出参数列表中的表达式或变量的功能。2 系统任务系统任务$monitor当启动一个或带有一个或多个参数的$monitor时,仿真器则建立一个处理机制,使得当参数列表中变量或表达式的值发生变化时,整个参数列表中的变量或表达式的值都将输出显示。例如$monitor($time,”rxd=%b txd=%b”,rdx,txd);例:initial$monitor($time,”a=%b,b=%h”,a,b);/每当a 或b值变化时该系统任务都显示当前的仿真时刻并分别用二进制和十六进制显示信号a和 b的值$time 可以返回一个以64位的整数来表示的当前仿真时刻值,该时刻是以模块的仿真时间尺度为基准的。3 系统函数系统函数$time例如 timescale 10 ns/1nsModule test;reg set parameter p=1.6;initial begin$monitor($time,”set=”,set);#p set=0;#p set=1;end输出:0 set=x2 set=03 set=1功能:退出仿真器,返回操作系统,结束仿真过程。4 系统任务系统任务$Finish功能:将仿真器设置成暂停模式,仿真环境下给出一个交互的命令模式,将控制权交给用户。5 系统任务系统任务$stop功能:返回一个32位的随机数,为带符号的整形数。6 系统任务系统任务$randomReg 23:0 rand;Rand=$random%60用法:$random%d,b0,给出一个范围在(-b+1,b-1)的随机数特殊符号特殊符号“#”#”在模块实例引用时表示参数传递在模块实例引用时表示参数传递特殊符号特殊符号“#”常用来表示延迟:常用来表示延迟:在过程赋值语句时表示延迟。在过程赋值语句时表示延迟。例:initial begin#10 rst=1;#50 rst=0;end在门级实例引用时表示延迟。在门级实例引用时表示延迟。例:not#1 not1(nsel,sel);and#2 and2(a1,a,nsel);编译引导语句用主键盘左上角小写键“”起头用于指导仿真编译器在编译时采取一些特殊处理编译引导语句一直保持有效,直到被取消或重写resetall 编译引导语句把所有设置的编译引导恢复到缺省状态常用的编译引导有:1.define2.include3.timescale4.uselib5.resetall .编译预处理编译预处理使用define 编译引导能提供简单的文本替代功能 define 在编译时会用宏文本来替代源代码中的宏名。举例说明:define on 1b1define off 1b0define and_delay#3/在程序中可以用有含义的文字来表示没有意思的数码提高了程序的可读性,在程序中可以用 on,off,and_delay 分别表示 1,0,和#3。合理地使用define可以提高程序的可读性defineincludeinclude使使用用include include 编编译译引引导导,在在编编译译时时能能把把其其指指定定的的整整个个文文件件包包括进来一起处理括进来一起处理举例说明:include“global.v”include“parts/counter.v”include“././library/mux.v”合理地使用include 可以使程序简洁、清晰、条理清楚、易于查错。timescale 用于说明程序中的时间单位和仿真精度举例说明:举例说明:timescale 1ns/100pstimescaletimescale 语句必须放在模块边界前面举例说明:举例说明:timescale 1ns/100ps module MUX2_1(out,a,b,sel);not#1 not1(nsel,sel);and#2 and1(a1,a,nsel);endmodule尽可能地使精度与时间单位接近,只要满足设计的实际需要就行。举例说明:举例说明:在上例中所有的时间单位都是在上例中所有的时间单位都是1ns的整数倍的整数倍举例:timescale 1ns/10ps module M1(.);not#1.23 not1(nsel,sel);/1.23 ns中共有12300个STU(100fs)endmodule timescale 100ns/1ns module M2(.);not#1.23 not1(nsel,sel);/123 ns中共有个STU(100fs)endmodule timescale 1ps/100fs module M3(.);not#1.23 not1(nsel,sel);/1.23 ps中共有12个STU(100fs)endmodule仿真步长即仿真单位(仿真步长即仿真单位(STU)是所有参加仿真模块中由是所有参加仿真模块中由timescale 指定的精度中最高(即时间最短)的那个决定指定的精度中最高(即时间最短)的那个决定的:的:(STU=100fs)时间单位:fs(呼秒)femptoseconds:1.0E-15 秒 ps(皮秒)picoseconds:1.0E-12 秒 ns(纳秒)nonoseconds:1.0E-9 秒 us(微秒)microseconds:1.0E-6 秒 ms(毫秒)milliseconds:1.0E-3 秒 s(秒)seconds:1.0 秒 uselib 编译引导语句:编译引导语句:用于定义仿真器到哪里去找库元件 如果该引导语句启动的话,它就一直有效,直到遇到另外一个uselib的定义或resetall语句 比其他配置库搜索路径的命令选项作用大 如如果果仿仿真真器器在在 uselibuselib定定义义的的地地点点找找不不到到器器件件库库,它它不不会会转转向向由由编编译命令行译命令行-v-v 和和-y-y选项指定的器件库去找。选项指定的器件库去找。uselib写在最后写在最后成功的基成功的基础在于好的学在于好的学习习惯The foundation of success lies in good habits59 结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End演讲人:XXXXXX 时 间:XX年XX月XX日
展开阅读全文