Verilog语法简易手册.ppt

上传人:牧羊曲112 文档编号:5452076 上传时间:2023-07-08 格式:PPT 页数:117 大小:709KB
返回 下载 相关 举报
Verilog语法简易手册.ppt_第1页
第1页 / 共117页
Verilog语法简易手册.ppt_第2页
第2页 / 共117页
Verilog语法简易手册.ppt_第3页
第3页 / 共117页
Verilog语法简易手册.ppt_第4页
第4页 / 共117页
Verilog语法简易手册.ppt_第5页
第5页 / 共117页
点击查看更多>>
资源描述

《Verilog语法简易手册.ppt》由会员分享,可在线阅读,更多相关《Verilog语法简易手册.ppt(117页珍藏版)》请在三一办公上搜索。

1、第10章 Verilog操作符,学习内容:熟悉Verilog语言的操作符,操作符类型,下表以优先级顺序列出了Verilog操作符。注意“与”操作符的优先级总是比相同类型的“或”操作符高。本章将对每个操作符用一个例子作出解释。,最高,最低,优先级,Verilog中的大小(size)与符号,Verilog根据表达式中变量的长度对表达式的值自动地进行调整。Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。当一个负数赋值给无符号变量如reg时,Verilog自动完成二进制补码计算,module sign_size;reg 3:0 a,b;reg 15:0 c;initial begi

2、n a=-1;/a是无符号数,因此其值为1111 b=8;c=8;/b=c=1000#10 b=b+a;/结果10111截断,b=0111#10 c=c+a;/c=10111 endendmodule,算术操作符,module arithops();parameter five=5;integer ans,int;reg 3:0 rega,regb;reg 3:0 num;initial begin rega=3;regb=4b1010;int=-3;/int=11111111_1101 end initial fork#10 ans=five*int;/ans=-15#20 ans=(int

3、+5)/2;/ans=1#30 ans=five/int;/ans=-1#40 num=rega+regb;/num=1101#50 num=rega+1;/num=0100#60 num=int;/num=1101#70 num=regb%rega;/num=1#80$finish;joinendmodule,+加-减*乘/除%模,将负数赋值给reg或其它无符号变量使用2的补码算术。如果操作数的某一位是x或z,则结果为x 在整数除法中,余数舍弃 模运算中使用第一个操作数的符号,注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。,按位操作符,mod

4、ule bitwise();reg 3:0 rega,regb,regc;reg 3:0 num;initial begin rega=4b1001;regb=4b1010;regc=4b11x0;end initial fork#10 num=rega joinendmodule,not&and|orxor xnor xnor,按位操作符对矢量中相对应位运算。regb=4b1 0 1 0 regc=4b1 x 1 0num=regb 位值为x时不一定产生x结果。如#50时的or计算。,当两个操作数位数不同时,位数少的操作数零扩展到相同位数。,a=4b1011;b=8b01010011;c=a

5、|b;/a零扩展为 8b00001011,逻辑操作符,module logical();parameter five=5;reg ans;reg 3:0 rega,regb,regc;initial begin rega=4b0011;/逻辑值为“1”regb=4b10 xz;/逻辑值为“1”regc=4b0z0 x;/逻辑值为“x”end initial fork#10 ans=rega joinendmodule,!not&and|or,逻辑操作符的结果为一位1,0或x。逻辑操作符只对逻辑值运算。如操作数为全0,则其逻辑值为false如操作数有一位为1,则其逻辑值为true若操作数只包含0

6、、x、z,则逻辑值为x,逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。,逻辑反与位反的对比,module negation();reg 3:0 rega,regb;reg 3:0 bit;reg log;initial begin rega=4b1011;regb=4b0000;end initial fork#10 bit=rega;/num=0100#20 bit=regb;/num=1111#30 log=!rega;/num=0#40 log=!regb;/num=1#50$finish;joinendmodule,!logical not

7、逻辑反 bit-wise not 位反,逻辑反的结果为一位1,0或x。位反的结果与操作数的位数相同,逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全0,则其逻辑值为0,逻辑反操作值为1。,一元归约操作符,module reduction();reg val;reg 3:0 rega,regb;initial begin rega=4b0100;regb=4b1111;end initial fork#10 val=joinendmodule,&and|orxor xnor xnor,归约操作符的操作数只有一个。对操作数的所有位进行位操作。结果只有一位,可以是0,1,X。,移位操作符,mod

8、ule shift();reg 9:0 num,num1;reg 7:0 rega,regb;initial rega=8b00001100;initial fork#10 num 3;/num=00_0000_0001#20 regb 3;/regb=0000_0001#30 num 2;/rega=1111_1100#50 num1 2;/num1=00_1111_1100#60$finish;joinendmodule,逻辑右移逻辑左移,移位操作符对其左边的操作数进行向左或向右的位移位操作。第二个操作数(移位位数)是无符号数若第二个操作数是x或z则结果为x,在赋值语句中,如果右边(RHS

9、)的结果:位宽大于左边,则把最高位截去位宽小于左边,则零扩展,将左边的操作数右移右边操作数指定的位数,左移先补后移右移先移后补,建议:表达式左右位数一致,关系操作符,module relationals();reg 3:0 rega,regb,regc;reg val;initial begin rega=4b0011;regb=4b1010;regc=4b0 x10;end initial fork#10 val=regc rega;/val=x#20 val=regb=rega;/val=1#40 val=regb regc;/val=1#50$finish;joinendmodule,大

10、于=大于等于=小于等于,其结果是1b1、1b0或1bx。,无论x为何值,regbregc,rega和regc的关系取决于x,相等操作符,赋值操作符,将等式右边表达式的值拷贝到左边。,注意逻辑等与case等的差别,=,逻辑等,=,case等,=,2b1x=2b0 x 值为0,因为不相等2b1x=2b1x 值为x,因为可能不相等,也可能相等,2b1x=2b0 x 值为0,因为不相同2b1x=2b1x 值为1,因为相同,a=2b1x;b=2b1x;if(a=b)$display(a is equal to b);else$display(a is not equal to b);,a=2b1x;b=

11、2b1x;if(a=b)$display(a is identical to b);else$display(a is not identical to b);,Case等只能用于行为描述,不能用于RTL描述。,相等操作符,逻辑等 逻辑不等,=!=,module equalities1();reg 3:0 rega,regb,regc;reg val;initial begin rega=4b0011;regb=4b1010;regc=4b1x10;end initial fork#10 val=rega=regb;/val=0#20 val=rega!=regc;/val=1#30 val=

12、regb!=regc;/val=x#40 val=regc=regc;/val=x#50$finish;joinendmodule,其结果是1b1、1b0或1bx。如果左边及右边为确定值并且相等,则结果为1。如果左边及右边为确定值并且不相等,则结果为0。如果左边及右边有值不能确定的位,但值确定的位相等,则结果为x。!=的结果与=相反,值确定是指所有的位为0或1。不确定值是有值为x或z的位。,相等操作符,相同(case等)不相同(case不等),=!=,module equalities2();reg 3:0 rega,regb,regc;reg val;initial begin rega=4

13、b0011;regb=4b1010;regc=4b1x10;end initial fork#10 val=rega=regb;/val=0#20 val=rega!=regc;/val=1#30 val=regb=regc;/val=0#40 val=regc=regc;/val=1#50$finish;joinendmodule,其结果是1b1、1b0或1bx。如果左边及右边的值相同(包括x、z),则结果为1。如果左边及右边的值不相同,则结果为0。!=的结果与=相反,综合工具不支持,条件操作符,条件,?:,module likebufif(in,en,out);input in;input

14、 en;output out;assign out=(en=1)?in:bz;endmodulemodule like4to1(a,b,c,d,sel,out);input a,b,c,d;input 1:0 sel;output out;assign out=sel=2b00?a:sel=2b01?b:sel=2b10?c:d;endmodule,如果条件值为x或z,则结果可能为x或z,条件操作符,条件操作符的语法为:=?:,registger=condition?true_value:false_value;,其意思是:if condition is TRUE,then LHS=true_

15、expression,else LHS=false_expression,每个条件操作符必须有三个参数,缺少任何一个都会产生错误。最后一个操作数作为缺省值。,上式中,若condition为真则register等于true_value;若condition为假则register等于false_value。一个很有意思的地方是,如果条件值不确定,且true_value和false_value不相等,则输出不确定值。,例如:assign out=(sel=0)?a:b;,若sel为0则out=a;若sel为1则out=b。如果sel为x或z,若a=b=0,则out=0;若ab,则out值不确定。,级

16、联操作符,级联,可以从不同的矢量中选择位并用它们组成一个新的矢量。用于位的重组和矢量构造,module concatenation;reg 7:0 rega,regb,regc,regd;reg 7:0 new;initial begin rega=8b0000_0011;regb=8b0000_0100;regc=8b0001_1000;regd=8b1110_0000;end initial fork#10 new=regc 4:3,regd 7:5,regb 2,rega 1:0;/new=8b11111111#20$finish;joinendmodule,在级联和复制时,必须指定位数

17、,否则将产生错误。下面是类似错误的例子:a7:0=4 b10;b7:0=2 5;c3:0=3b011,b0;级联时不限定操作数的数目。在操作符符号 中,用逗号将操作数分开。例如:A,B,C,D,复制,复制,复制一个变量或在 中的值,module replicate();reg 3:0 rega;reg 1:0 regb,regc;reg 7:0 bus;initial begin rega=4b1001;regb=2b11;regc=2b00;end initial fork#10 bus=4 regb;/bus=11111111/regb is replicated 4 times.#20

18、bus=2 regb,2 regc;/bus=11110000.regc and regb are each/replicated,and the resulting vectors/are concatenated together#30 bus=4 rega1,rega;/bus=00001001.rega is sign-extended#40$finish;joinendmodule,前两个 符号之间的正整数指定复制次数。,复习,第11章 行为建模,学习内容:行为建模的基本概念Verilog中高级编程语言结构如何使用连续赋值,行为描述,行为级描述是对系统的高抽象级描述。在这个抽象级,注

19、重的是整个系统的功能而不是实现。Verilog有高级编程语言结构用于行为描述,包括:wait,while,if then,case和foreverVerilog的行为建模是用一系列以高级编程语言编写的并行的、动态的过程块来描述系统的工作。,过程(procedural)块,过程块是行为模型的基础。过程块有两种:initial块,只能执行一次always块,循环执行过程块中有下列部件过程赋值语句:在描述过程块中的数据流高级结构(循环,条件语句):描述块的功能时序控制:控制块的执行及块中的语句。,过程赋值(procedural assignment),在过程块中的赋值称为过程赋值。在过程赋值语句中表

20、达式左边的信号必须是寄存器类型(如reg类型)在过程赋值语句等式右边可以是任何有效的表达式,数据类型也没有限制。如果一个信号没有声明则缺省为wire类型。使用过程赋值语句给wire赋值会产生错误。,module adder(out,a,b,cin);input a,b,cin;output 1:0 out;wire a,b,cin;reg half_sum;reg 1:0 out;always(a or b or cin)begin half_sum=a b cin;/OK half_carry=a endendmodule,half_carry没有声明,过程时序控制,在过程块中可以说明过程时

21、序。过程时序控制有三类:简单延时(#delay):延迟指定时间步后执行边沿敏感的时序控制:()在信号发生翻转后执行。可以说明信号有效沿是上升沿(posedge)还是下降沿(negedge)。可以用关键字or指定多个参数。电平敏感的时序控制:wait()直至expr值为真时(非零)才执行。若expr已经为真则立即执行。,module wait_test;reg clk,waito,edgeo;initial begininitial begin clk=0;edgeo=0;waito=0;endalways#10 clk=clk;always(clk)#2 edgeo=edgeo;always

22、wait(clk)#2 waito=waito;endmodule,简单延时,在test bench中使用简单延时(#延时)施加激励,或在行为模型中模拟实际延时。,module muxtwo(out,a,b,sl);input a,b,sl;output out;reg out;always(sl or a or b)if(!sl)#10 out=a;/从a到out延时10个时间单位 else#12 out=b;/从b到out延时12个时间单位endmodule,在简单延时中可以使用模块参数parameter:module clock_gen(clk);output clk;reg clk;p

23、arameter cycle=20;initial clk=0;always#(cycle/2)clk=clk;endmodule,边沿敏感时序,时序控制可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以用关键字posedge和negedge限定信号敏感边沿。敏感表中可以有多个信号,用关键字or连接。,module reg_ adder(out,a,b,clk);input clk;input 2:0 a,b;output 3:0 out;reg 3:0 out;reg 3:0 sum;always(a or b)/若a或b发生任何变化,执行#5 sum=a+b;always(negedg

24、e clk)/在clk下降沿执行 out=sum;endmodule,注:事件控制符or和位或操作符|及逻辑或操作符|没有任何关系。,wait语句,wait用于行为级代码中电平敏感的时序控制。下面 的输出锁存的加法器的行为描述中,使用了用关键字or的边沿敏感时序以及用wait语句描述的电平敏感时序。,module latch_adder(out,a,b,enable);input enable;input 2:0 a,b;output 3:0 out;reg 3:0 out;always(a or b)begin wait(!enable)/当enable为低电平时执行加法 out=a+b;e

25、ndendmodule,注:综合工具还不支持wait语句。,命名事件(named event),在行为代码中定义一个命名事件可以触发一个活动。命名事件不可综合。,module add_mult(out,a,b);input 2:0 a,b;output 3:0 out;reg 3:0 out;/*define events*event add,mult;always(a or b)if(a b)-add;/*trigger event*else-mult;/*trigger event*/*respond to an event trigger*always(add)out=a+b;/*res

26、pond to an event trigger*always(mult)out=a*b;endmodule,在例子中,事件add和mult不是端口,但定义为事件,它们没有对应的硬件实现。是一种数据类型,能在过程块中触发一个使能。在引用前必须声明 没有持续时间,也不具有任何值 只能在过程块中触发一个事件。-操作符用来触发命名事件。a大于b,事件add被触发,控制传递到等待add的always块。如果a小于或等于b,事件mult被触发,控制被传送到等待mult的always块。,行为描述举例,在上面的例子中发生下面顺序的事件:等待set=1,忽略时刻10的clk的posedge。等待下一个clk

27、的posedge,它将在时刻30发生。等待3个时间单位,在时刻33(30+3)置q=1。等待10个时间单位,在时刻43(33+10)置q=0。等待在时刻48发生的set=0。等待在时刻70发生且与clk的上升沿同时发生的set=1。等待下一个上升沿。时刻70的边沿被忽略,因为到达该语句时时间已经过去了,如例子所示,clk=1。重要内容:在实际硬件设计中,事件6应该被视为一个竞争(race condition)。在仿真过程中,值的确定倚赖于顺序,所以是不可预测的。这是不推荐的建模类型。,always wait(set)begin(posedge clk)#3 q=1;#10 q=0;wait(!

28、set);end,竞争,RTL描述举例,module dff(q,qb,d,clk);output q,qb;input d,clk;reg q,qb;always(posedge clk)begin q=d;qb=d;endendmodule,下面的RTL例子中只使用单个边沿敏感时序控制。,块语句,块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块语句分为两类:顺序块:语句置于关键字begin和end之间,块中的语句以顺序方式执行。并行块:关键字fork和join之间的是并行块语句,块中的语句并行执行。,Fork和join语句常用于test bench描述。这是因为可以一起给出

29、矢量及其绝对时间,而不必描述所有先前事件的时间。,块语句(续),在顺序块中,语句一条接一条地计算执行。在并行块中,所有语句在各自的延迟之后立即计算执行。,begin#5 a=3;#5 a=5;#5 a=4;end,fork#5 a=3;#15 a=4;#10 a=5;join,上面的两个例子在功能上是等价的。Fork-join例子里的赋值故意打乱顺序是为了强调顺序是没有关系的。注意fork-join块是典型的不可综合语句,并且在一些仿真器时效率较差。,延迟赋值语句,begin temp=b;(posedge clk)a=temp;end,a=(posedge clk)b;,语法:LHS=RHS

30、;时序控制延迟的是赋值而不是右边表达式的计算。在延迟赋值语句中RHS表达式的值都有一个隐含的临时存储。可以用来简单精确地模拟寄存器交换和移位。,等价语句,LHS:Left-hand-sideRHS:Right-hand-side,延迟赋值语句,begin a=#5 b;b=#5 a;#10$diplay(a,b);end,fork a=#5 b;b=#5 a;#10$diplay(a,b);join,在左边的例子中,b的值被立即采样(时刻0),这个值在时刻5赋给a。a的值在时刻5被采样,这个值在时刻10赋给b。注意,另一个过程块可能在时刻0到时刻5之间影响b的值,或在时刻5到时刻10之间影响a

31、的值。在右边的例子中,b和a的值被立即采样(时刻0),保存的值在时刻5被赋值给他们各自的目标。这是一个安全传输。注意,另一个过程块可以在时刻0到时刻5之间影响a和b的值。,并行语句在同一时间步发生,但由仿真器在另外一个时间执行。在下面的每个例子中,a和b的值什么时候被采样?在下面的每个例子中,什么时候给a和b赋值?,b值拷贝到a然后回传,a和b值安全交换,非阻塞过程赋值,module swap_vals;reg a,b,clk;initial begin a=0;b=1;clk=0;end always#5 clk=clk;always(posedge clk)begin a=b;/非阻塞过程

32、赋值 b=a;/交换a和b值 endendmodule,阻塞过程赋值执行完成后再执行在顺序块内下一条语句。非阻塞赋值不阻塞过程流,仿真器读入一条赋值语句并对它进行调度之后,就可以处理下一条赋值语句。若过程块中的所有赋值都是非阻塞的,赋值按两步进行:仿真器计算所有RHS表达式的值,保存结果,并进行调度在时序控制指定时间的赋值。在经过相应的延迟后,仿真器通过将保存的值赋给LHS表达式完成赋值。,阻塞过程赋值,非阻塞过程赋值,过程赋值有两类,非阻塞过程赋值(续),module non_block1;reg a,b,c,d,e,f;initial begin/blocking assignments

33、a=#10 1;/time 10 b=#2 0;/time 12 c=#4 1;/time 16 end initial begin/non-blocking assignments d=#10 1;/time 10 e=#2 0;/time 2 f=#4 1;/time 4 end initial begin$monitor($time,a=%b b=%b c=%b d=%b e=%b f=%b,a,b,c,d,e,f);#100$finish;endendmodule,输出结果:0 a=x b=x c=x d=x e=x f=x 2 a=x b=x c=x d=x e=0 f=x 4 a=

34、x b=x c=x d=x e=0 f=110 a=1 b=x c=x d=1 e=0 f=112 a=1 b=0 c=x d=1 e=0 f=116 a=1 b=0 c=1 d=1 e=0 f=1,阻塞与非阻塞赋值语句行为差别举例1,非阻塞过程赋值(续),阻塞与非阻塞赋值语句行为差别举例2,module pipeMult(product,mPlier,mCand,go,clock);input go,clock;input 7:0 mPlier,mCand;output 15:0 product;reg 15:0 product;always(posedge go)product=repea

35、t(4)(posedge clock)mPlier*mCand;endmodule,module pipeMult(product,mPlier,mCand,go,clock);input go,clock;input 7:0 mPlier,mCand;output 15:0 product;reg 15:0 product;always(posedge go)product=repeat(4)(posedge clock)mPlier*mCand;endmodule,非阻塞过程赋值(续),阻塞与非阻塞赋值语句行为差别举例2波形,非阻塞,阻塞,非阻塞过程赋值(续),阻塞与非阻塞赋值语句行为差别

36、举例3,DFF,同步复位DFF,同步置位DFF,非阻塞过程赋值(续),举例4:非阻塞赋值语句中延时在左边和右边的差别,module exchange;reg3:0 a,b;initial begin a=1;b=4;#2 a=3;b=2;#20$finish;end initial$monitor($time,t%ht%h,a,b);initial begin#5 a=b;#5 b=a;endendmodule,module exchange;reg3:0 a,b;initial begin a=1;b=4;#2 a=3;b=2;#20$finish;end initial$monitor($

37、time,t%ht%h,a,b);initial begin a=#5 b;b=#5 a;endendmodule,time a b0 1 42 3 25 4 1,time a b0 1 42 3 25 2 2,条件语句(if分支语句),可以多层嵌套。在嵌套if序列中,else和前面最近的if相关。为提高可读性及确保正确关联,使用beginend块语句指定其作用域。,always#20 if(index 0)/开始外层 if if(rega regb)/开始内层第一层 if result=rega;else result=0;/结束内层第一层 if else if(index=0)begin$

38、display(Note:Index is zero);result=regb;end else$display(Note:Index is negative);,if 和 if-else 语句:,描述方式:if(表达式)begin end else begin end,条件语句(case分支语句),case语句:,在Verilog中重复说明case项是合法的,因为Verilog的case语句只执行第一个符合项。,条件语句-case语句,case语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件语句。,Case语句进行逐位比较以求完全匹配(包括x和z)。Default语句可选,在没有

39、任何条件成立时执行。此时如果未说明default,Verilog不执行任何动作。多个default语句是非法的。,重要内容:使用default语句是一个很好的编程习惯,特别是用于检测x和z。Casez和casex为case语句的变体,允许比较无关(dont-care)值。case表达式或case项中的任何位为无关值时,在比较过程中该位不予考虑。在casez语句中,?和 z 被当作无关值。在casex语句中,?,z 和 x 被当作无关值。,case,:赋值语句或空语句;,:赋值语句或空语句;default:赋值语句或空语句;,case语法:,循环(looping)语句,有四种循环语句:repea

40、t:将一块语句循环执行确定次数。repeat(次数表达式)while:在条件表达式为真时一直循环执行 while(条件表达式)forever:重复执行直到仿真结束 forever for:在执行过程中对变量进行计算和判断,在条件满足时执行 for(赋初值;条件表达式;计算),循环(looping)语句-repeat,repeat:将一块语句循环执行确定次数。repeat(次数表达式)语句,为什么要说明一个shift_opb变量?,循环(looping)语句,while:只要表达式为真(不为0),则重复执行一条语句(或语句块),.reg clk;initial begin clk=0;forev

41、er begin#10 clk=1;#10 clk=0;endend.,循环(looping)语句,forever:一直执行到仿真结束 forever应该是过程块中最后一条语句。其后的语句将永远不会执行。forever语句不可综合,通常用于test bench描述。,这种行为描述方式可以非常灵活的描述时钟,可以控制时钟的开始时间及周期占空比。仿真效率也高。,循环(looping)语句,for:只要条件为真就一直执行 条件表达式若是简单的与0比较通常处理得更快一些。但综合工具可能不支持与0的比较。,行为级零延时循环,当事件队列中所有事件结束后仿真器向前推进。但在零延时循环中,事件在同一时间片不断

42、加入,使仿真器停滞后那个时片。在下面的例子中,对事件进行了仿真但仿真时间不会推进。当always块和forever块中没有时序控制时就会发生这种事情。,module comparator(out,in1,in2);output 1:0 out;input 7:0 in1,in2;reg 1:0 out;always if(in1=in2)out=2b00;else if(in1 in2)out=2b01;else out=2b10;initial#10$finish;endmodule,持续赋值(continuous assignment),可以用持续赋值语句描述组合逻辑,代替用门及其连接描述

43、方式。持续赋值在过程块外部使用。持续赋值用于net驱动。持续赋值只能在等式左边有一个简单延时说明。只限于在表达式左边用#delay形式持续赋值可以是显式或隐含的。语法:#delay strength=;,wire out;assign out=a/隐含,持续赋值(continuous assignment)(续),持续赋值的例子,持续赋值(continuous assignment)(续),隐含或显式赋值给任何net类型赋值给矢量net的位或部分赋值设置延时设置强度用级联同时给几个net类变量赋值使用条件操作符使用用户定义的函数的返回值可以是任意表达式,包括常数表达式,in的值赋给o1,但其每

44、位赋值的强度及延迟可能不同。如果o1是一个标量(scalar)信号,则其延迟和前面的条件缓冲器上的门延迟相同。对向量线网(net)的赋值上的延迟情况不同。0赋值使用下降延迟,Z赋值使用关断延迟,所有其他赋值使用上升延迟。上面的例子显示出持续赋值的灵活性和简单性。持续赋值可以:,持续赋值(continuous assignment)(续),从上面的例子可以看出,持续赋值的功能很强。可以使用条件操作符,也可以对一个net多重赋值(驱动)。在任何时间里只有一个赋值驱动MUX2到一个非三态值。如果所有驱动都为三态,则mux2缺省为一个上拉强度的1值。,复习,问题:在哪里放置always块?foreve

45、r循环呢?持续赋值通常给哪种类型的逻辑建模?在beginend之间使用非阻塞赋值和forkjoin块有哪些区别?Verilog中posedge是什么意思?Verilog中存在哪些条件结构?,解答:always是块语句,在module内使用。forever循环是在过程块、task或function内使用。持续赋值只能给组合逻辑建模,因为他们只包含简单延迟。过程块可以包含和wait时序控制。forkjoin块可以使用等式左边延迟可以包含并行语句(循环,条件语句,任务,系统任务,事件触发器),不仅仅是并行赋值。是典型的不可综合语句 posedge是任何可能从低到高的跳变(0-1,0-z,0-x,z-

46、x,x-z,z-1,x-1)。Case、if-else语句以及?:条件操作符。,第12章 TUI调试,进入交互式仿真模式控制并观察仿真浏览设计层次检查(checkpointing)和退出仿真对设计进行临时修补动态的单步及跟踪仿真使用命令历史列表,学习内容:在本章中将学习用Verilog-XL TUI(Textual User Interface)和NC Verilog TUI调试,术语及定义,SHM 仿真历史管理器(Simulation History Manager)。一个管理由SimWave显示的仿真对象值数据跳变的工具CLIVerilog-XL命令行界面(command line int

47、erface),通过它你可以控制仿真并对Verilog过程语句执行调试操作Tcl工具命令语言(Tool Command Language)。用于对交互式程序提出命令的脚本语言VCD(Value Change Dump)。存储对象值跳变数据的文件格式,纵览,什么是CLI(Command Line Interface)?一个允许输入Verilog HDL过程命令的Verilog-XL仿真器的TUICLI命令是一个Verilog过程语句或语句块。Verilog过程语句包括过程赋值,循环,条件语句和任务以及功能调用。可以在一行里输入多个Verilog语句,语句之间由一个分号他开,如同在源代码中那样。V

48、erilog-XL有源代码调试命令,这些命令不在IEEE规范中,可以在Verilog描述中使用,但这不很必要。什么是Tcl(Tool Command Language)一个对许多软件工具包括NC Verilog的文本用户界面。NC Verilog仿真器的面向对象的TUI。一个Tcl命令包括一个或多个字(命令名,后面是命令的argument)。字之间由空格或tab分隔。可以在一个命令行中输入多个命令,中间用分号分开。可以从网上、技术参考书或图书馆得到标准Tcl命令的信息。NC Verilog有专用标准Tcl命令集扩展用于设计调试(在ncsim命令窗口输入)。本章将对大部分NC Verilog专用

49、扩展作简单描述。联机文档中有更详细解释。CLI和Tcl命令可以在命令行交互式输入,也可以由源脚本或keyfile输入。注意:单击工具按钮或选择菜单时,SimVision GUI自动发出CLI和Tcl命令作出响应。在本章中将通过实际调试CLI和Tcl的实例来学习二者的界面。,进入交互模式,有三种方法中断仿真,进入交互模式:使用-s命令行选项在仿真前(时间0)停止仿真,立即进入交互模式在仿真过程中输入一个C异步中断到达一个断点或在源代码里的$stop系统任务。当中断Verilog-XL时,仿真器进入交互式模式并给出提示符:C1 当中断NC Verilog时,进入交互式模式并给出提示符:ncsim

50、此时,仿真器暂时挂起。可以在命令行提示符处输入交互式命令,然后继续仿真。,进入交互模式,仿真器允许在离散的时间点中断仿真并与设计进行交流。有三种方法进入交互模式:使用-s命令行选项在时间0停止仿真输入一个C异步中断可以用测试基准中的$stop系统任务使仿真在指定的时间(或基于一个指定的事件)进入交互式模式。当仿真器被中断时,它进入交互式模式并给出输入命令的提示符。在Verilog-XL CLI中,可以输入任何可以放在一个过程块内的语句,并输入一些只用于调试环境的特殊命令。在NC Verilog Tcl界面中,可以输入标准Tcl命令,Tcl的NC Verilog扩展,或将被传送到操作系统的she

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号