教学课件第10章Verilog操作符

上传人:s9****2 文档编号:569361193 上传时间:2024-07-29 格式:PPT 页数:117 大小:712KB
返回 下载 相关 举报
教学课件第10章Verilog操作符_第1页
第1页 / 共117页
教学课件第10章Verilog操作符_第2页
第2页 / 共117页
教学课件第10章Verilog操作符_第3页
第3页 / 共117页
教学课件第10章Verilog操作符_第4页
第4页 / 共117页
教学课件第10章Verilog操作符_第5页
第5页 / 共117页
点击查看更多>>
资源描述

《教学课件第10章Verilog操作符》由会员分享,可在线阅读,更多相关《教学课件第10章Verilog操作符(117页珍藏版)》请在金锄头文库上搜索。

1、第第1010章章 Verilog操作符操作符学习内容:学习内容:熟悉熟悉Verilog语言的操作符语言的操作符操作符类型操作符类型下表以优先级顺序列出了下表以优先级顺序列出了Verilog操作符。注意操作符。注意“与与”操作符的优先级总是比相同操作符的优先级总是比相同类型的类型的“或或”操作符高。本章将对每个操作符用一个例子作出解释。操作符高。本章将对每个操作符用一个例子作出解释。 操作符类型操作符类型符号符号连接及复制操作符一元操作符算术操作符逻辑移位操作符关系操作符相等操作符按位操作符逻辑操作符条件操作符!&|*/%+-=!=!=&|&|?:最高最高最低最低优先级优先级Verilog中的大

2、小中的大小(size)与符号与符号Verilog根据表达式中变量的长度对表达式的值自动地进行调整。根据表达式中变量的长度对表达式的值自动地进行调整。Verilog自动截断或扩展赋值语句中右边的值以适应左边变量的长度。自动截断或扩展赋值语句中右边的值以适应左边变量的长度。当一个负数赋值给无符号变量如当一个负数赋值给无符号变量如reg时,时,Verilog自动完成二进制补码计算自动完成二进制补码计算module sign_size; reg 3:0 a, b; reg 15:0 c; initial begin a = -1; / a是无符号数,因此其值为是无符号数,因此其值为1111 b = 8

3、; 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

4、 = five * int; / ans = -15 #20 ans = (int + 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

5、的补码算术。的补码算术。 如果操作数的某一位是如果操作数的某一位是x或或z,则结果,则结果为为x 在整数除法中,余数舍弃在整数除法中,余数舍弃 模运算中使用第一个操作数的符号模运算中使用第一个操作数的符号注意integer和reg类型在算术运算时的差别。integer是有符号数,而reg是无符号数。按位操作符按位操作符module bitwise (); reg 3: 0 rega, regb, regc; reg 3: 0 num; initial begin rega = 4b1001; regb = 4b1010; regc = 4b11x0; end initial fork #10

6、num = rega & 0; / num = 0000 #20 num = rega & regb; / num = 1000 #30 num = rega | regb; / num = 1011 #40 num = regb & regc; / num = 10x0 #50 num = regb | regc; / num = 1110 #60 $finish; joinendmodulenot&and|orxorxnorxnor 按位操作符对矢量中相对应位运算。按位操作符对矢量中相对应位运算。 regb = 4b1 0 1 0 regc = 4b1 x 1 0num = regb &

7、regc = 1 0 1 0 ; 位值为位值为x时不一定产生时不一定产生x结果。如结果。如#50时时的的or计算。计算。当两个操作数位数不同时,位数少的操作数零扩展到相同位数。a = 4b1011;b = 8b01010011;c = a | b; / a零扩展为零扩展为 8b00001011逻辑操作符逻辑操作符module logical (); parameter five = 5; reg ans; reg 3: 0 rega, regb, regc; initial begin rega = 4b0011; /逻辑值为逻辑值为“1” regb = 4b10xz; /逻辑值为逻辑值为“1

8、” regc = 4b0z0x; /逻辑值为逻辑值为“x” end initial fork #10 ans = rega & 0; / ans = 0 #20 ans = rega | 0; / ans = 1 #30 ans = rega & five; / ans = 1 #40 ans = regb & rega; / ans = 1 #50 ans = regc | 0; / ans = x #60 $finish; joinendmodule!not&and|or 逻辑操作符的结果为一位逻辑操作符的结果为一位1,0或或x。逻辑操作符只对逻辑值运算。逻辑操作符只对逻辑值运算。如操作数

9、为全如操作数为全0,则其逻辑值为,则其逻辑值为false如操作数有一位为如操作数有一位为1,则其逻辑值为,则其逻辑值为true若操作数若操作数只只包含包含0、x、z,则逻辑值为,则逻辑值为x逻辑反操作符将操作数的逻辑值取逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全反。例如,若操作数为全0,则其逻,则其逻辑值为辑值为0,逻辑反操作值为,逻辑反操作值为1。逻辑反与位反的对比逻辑反与位反的对比module negation(); reg 3: 0 rega, regb; reg 3: 0 bit; reg log; initial begin rega = 4b1011; regb = 4b

10、0000; 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!logicalnot逻辑反逻辑反bit-wisenot位反位反 逻辑反的结果为一位逻辑反的结果为一位1,0或或x。位反的结果与操作数的位数相同位反的结果与操作数的位数相同逻辑反操作符将操作数的逻辑值取逻辑反操作符将操作数的逻辑值取反。例如,若操作数为全反。例如,若操作数为全0

11、,则其逻,则其逻辑值为辑值为0,逻辑反操作值为,逻辑反操作值为1。一元归约操作符一元归约操作符module reduction(); reg val; reg 3: 0 rega, regb; initial begin rega = 4b0100; regb = 4b1111; end initial fork #10 val = & rega ; / val = 0 #20 val = | rega ; / val = 1 #30 val = & regb ; / val = 1 #40 val = | regb ; / val = 1 #50 val = rega ; / val = 1

12、 #60 val = regb ; / val = 0 #70 val = | rega; / (nor) val = 0 #80 val = & rega; / (nand) val = 1 #90 val = rega & ®b; / val = 1 $finish; joinendmodule&and|orxorxnorxnor 归约操作符的操作数只有一个。归约操作符的操作数只有一个。对操作数的所有位进行位操作。对操作数的所有位进行位操作。结果只有一位,可以是结果只有一位,可以是0, 1, X。移位操作符移位操作符module shift (); reg 9: 0 num, num

13、1; reg 7: 0 rega, regb; initial rega = 8b00001100; initial fork #10 num = rega 5 ; / num = 01_1000_0000 #10 regb = rega 5 ; / regb = 1000_0000 #20 num 3; / num = 00_0000_0001 #20 regb 3 ; / regb = 0000_0001 #30 num = 10b11_1111_0000; #40 rega = num 2; /rega = 1100_0000 #40 num1 = num 2;/num1=11_1100

14、_0000 #50 rega 2; /rega = 1111_1100 #50 num1 2;/num1=00_1111_1100 #60 $finish; joinendmodule逻辑右移逻辑左移 移位操作符对其左边的操作数进行移位操作符对其左边的操作数进行向左或向右的位移位操作。向左或向右的位移位操作。第二个操作数(移位位数)是无符第二个操作数(移位位数)是无符号数号数若第二个操作数是若第二个操作数是x或或z则结果为则结果为x在赋值语句中,如果右边在赋值语句中,如果右边(RHS)的结果的结果:位宽大于左边,则把最高位截去位宽大于左边,则把最高位截去位宽小于左边,则零扩展位宽小于左边,则零

15、扩展 将左边的操作数右移右边操将左边的操作数右移右边操作数指定的位数作数指定的位数左移先补后移左移先补后移右移先移后补右移先移后补建议:表达式左右位数一致建议:表达式左右位数一致关系操作符关系操作符module relationals (); reg 3: 0 rega, regb, regc; reg val; initial begin rega = 4b0011; regb = 4b1010; regc = 4b0x10; end initial fork #10 val = regc rega ; / val = x #20 val = regb = rega ; / val = 1

16、#40 val = regb regc ; / val = 1 #50 $finish; joinendmodule大于=大于等于大于等于regcrega和和regc的的关系取决于关系取决于x相等操作符相等操作符 赋值操作符,将等式右边表达式的值拷贝到左边。赋值操作符,将等式右边表达式的值拷贝到左边。注意逻辑等与注意逻辑等与case等的差别等的差别= 逻辑等逻辑等=01xz010xx101xxxxxxxzxxxx case等等=01xz0100010100x0010z00012b1x=2b0x 值为值为0,因为不相等,因为不相等2b1x=2b1x 值为值为x,因为可能不,因为可能不相等,也可能

17、相等相等,也可能相等2b1x=2b0x 值为值为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 = 2b1x;if (a = b) $display( a is identical to b);else $display( a is not identical to b);Case等只能用于行为描述,不能用于RTL描述。相等操作符相等操作符 逻辑等逻辑等 逻辑不等

18、逻辑不等=!=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 = regb != regc; / val = x #40 val = regc = regc; / val = x #50 $finish; joinendmodu

19、le 其结果是其结果是1b1、1b0或或1bx。 如果左边及右边为确定值并且如果左边及右边为确定值并且相等,则结果为相等,则结果为1。 如果左边及右边为确定值并且如果左边及右边为确定值并且不相等,则结果为不相等,则结果为0。 如果左边及右边有值不能确定如果左边及右边有值不能确定的位,但值确定的位相等,则结的位,但值确定的位相等,则结果为果为x。!=的结果与的结果与= =相反相反值确定是指所有的位为值确定是指所有的位为0或或1。不确定值是有值为不确定值是有值为x或或z的位。的位。相等操作符相等操作符 相同相同(case等等) 不相同不相同(case不等不等)=!=module equalitie

20、s2(); 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 = regb = regc; / val = 0 #40 val = regc = regc; / val = 1 #50 $finish; joinendmodule 其结果是其结果是1b1、1b0或或1bx。

21、 如果左边及右边的值相同(包如果左边及右边的值相同(包括括x、z),则结果为,则结果为1。如果左边及右边的值不相同,如果左边及右边的值不相同,则结果为则结果为0。!=的结果与的结果与 = 相反相反综合工具不支持综合工具不支持条件操作符条件操作符 条件条件?:module likebufif( in, en, out); input in; input en; output out; assign out = (en = 1) ? in : bz;endmodulemodule like4to1( a, b, c, d, sel, out); input a, b, c, d; input 1:

22、 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_expression, else LHS = false_expression每个条

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

24、l为为0则则out =a;若;若sel为为1则则out = b。如果。如果sel为为x或或z,若,若a = b =0,则,则out = 0;若;若ab,则,则out值不确定。值不确定。级联操作符级联操作符 级联级联 可以从不同的矢量中选择位并用可以从不同的矢量中选择位并用它们组成一个新的矢量。它们组成一个新的矢量。用于位的重组和矢量构造用于位的重组和矢量构造module concatenation; reg 7: 0 rega, regb, regc, regd; reg 7: 0 new; initial begin rega = 8b0000_0011; regb = 8b0000_010

25、0; 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在级联和复制时,必须指定位数,在级联和复制时,必须指定位数,否则将产生错误。否则将产生错误。下面是类似错误的例子:下面是类似错误的例子: a7:0 = 4 b10; b7:0 = 2 5; c3:0 = 3b011, b0;级联时不限定操作数的数目。在级联时不限定操作数的数目。在操作符符

26、号操作符符号 中,用逗号将操中,用逗号将操作数分开。例如作数分开。例如: 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 bus = 2

27、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前两个前两个 符号之间的正整数指定符号之间的正整数指定复制次数。复制次数。复习复习解答解答1、 进行进行1的补码操作,将矢量中的每一位取反的补码操作,将矢量中的每一位取

28、反 !将一个操作数归约为一位!将一个操作数归约为一位true或或false结果结果2、& 将操作数从低到高的对应位的进行与操作将操作数从低到高的对应位的进行与操作 & 将每个操作数归约为一位将每个操作数归约为一位true或或false,然后对归约结果进行与操作,然后对归约结果进行与操作3、要复制的操作数必须指定位数,例如、要复制的操作数必须指定位数,例如 3b1是非法的,因此是非法的,因此b1没有指定位数。而没有指定位数。而31b1是合法的是合法的1、 和!有什么不同?和!有什么不同?2、& 和和 & 有什么不同?有什么不同?3、用复制操作符复制一个数据时,对数据有什么要求?、用复制操作符复制

29、一个数据时,对数据有什么要求?问题:问题:第第1111章章 行为建模行为建模学习内容:学习内容:行为建模的基本概念行为建模的基本概念Verilog中高级编程语言结构中高级编程语言结构如何使用连续赋值如何使用连续赋值RTLRTL描述方式是行为描述方式的子集。在本章中的综合部描述方式是行为描述方式的子集。在本章中的综合部分将详细介绍哪些行为级结构同样可以用于分将详细介绍哪些行为级结构同样可以用于RTLRTL描述。描述。注:行为描述行为描述行为级描述是对系统的高抽象级描述。在这个抽象级,注重的是整个系行为级描述是对系统的高抽象级描述。在这个抽象级,注重的是整个系统的功能而不是实现。统的功能而不是实现

30、。Verilog有高级编程语言结构用于行为描述,包括:有高级编程语言结构用于行为描述,包括: wait, while, if then, case和和foreverVerilog的行为建模是用一系列以高级编程语言编写的并行的、动态的过的行为建模是用一系列以高级编程语言编写的并行的、动态的过程块来描述系统的工作。程块来描述系统的工作。在每一个时钟上升沿,在每一个时钟上升沿, 若若ClrClr不是低电平,不是低电平, 置置Q Q为为D D值,值, 置置QbQb为为D D值的反值的反DFF无论何时无论何时ClrClr变低变低 置置Q Q为为0 0, 置置QbQb为为1 1过程过程(procedura

31、l)块块过程块是行为模型的基础。过程块是行为模型的基础。过程块有两种:过程块有两种:initial块,只能执行一次块,只能执行一次always块,循环执行块,循环执行过程块中有下列部件过程块中有下列部件过程赋值语句:在描述过程块中的数据流过程赋值语句:在描述过程块中的数据流高级结构(循环,条件语句):描述块的功能高级结构(循环,条件语句):描述块的功能时序控制:控制块的执行及块中的语句。时序控制:控制块的执行及块中的语句。过程赋值过程赋值(procedural assignment)在过程块中的赋值称为过程赋值。在过程块中的赋值称为过程赋值。在过程赋值语句中表达式在过程赋值语句中表达式左边左边

32、的信号必须是的信号必须是寄存器类型寄存器类型(如(如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

33、or cin) begin half_sum = a b cin ; / OK half_carry = a & b | a & !b & cin | !a & b & cin ; / ERROR! out = half_carry, half_ sum ; endendmodulehalf_carryhalf_carry没有声明没有声明过程时序控制过程时序控制在过程块中可以说明过程时序。过程时序控制有三类:在过程块中可以说明过程时序。过程时序控制有三类:简单延时简单延时(#delay):延迟指定时间步后执行:延迟指定时间步后执行边沿敏感边沿敏感的时序控制:的时序控制:()在信号发生翻转后执行

34、。在信号发生翻转后执行。可以说明信号有效沿是上升沿可以说明信号有效沿是上升沿(posedge)还是下降沿还是下降沿(negedge)。可以用关键字可以用关键字or指定多个参数。指定多个参数。电平敏感电平敏感的时序控制:的时序控制:wait()直至直至expr值为真时(非零)才执行。值为真时(非零)才执行。若若expr已经为真则立即执行。已经为真则立即执行。modulewait_test;regclk,waito,edgeo;initialbegininitialbeginclk=0;edgeo=0;waito=0;endalways#10clk=clk;always(clk)#2edgeo=e

35、dgeo;alwayswait(clk)#2waito=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 a到到outout延时延时1010个时间单位个时间单位 else #12 out = b;/从从b b到到out

36、out延时延时1212个时间单位个时间单位endmodule在简单延时中可以使用模块参数在简单延时中可以使用模块参数parameter:module clock_gen (clk); output clk; reg clk; parameter cycle = 20; initial clk = 0; always #(cycle/2) clk = clk;endmodule边沿敏感时序边沿敏感时序时序控制时序控制可以用在可以用在RTL级或行为级组合逻辑或时序逻辑描述中。可以级或行为级组合逻辑或时序逻辑描述中。可以用关键字用关键字posedge和和negedge限定信号敏感边沿。敏感表中可以有

37、多个信限定信号敏感边沿。敏感表中可以有多个信号,用关键字号,用关键字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 ( negedge clk) / 在在clk下降沿执行下降沿执行 out = sum;endmodule注注:事件控制符:事件控制符or和位或操作符和位或操作符|及

38、逻辑或操作符及逻辑或操作符|没有任何关系。没有任何关系。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) begi

39、n wait (!enable) / 当当enable为低电平时执行加法为低电平时执行加法 out = a + b; endendmodule注注:综合工具还不支持:综合工具还不支持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; alw

40、ays (a or b) if (a b) - add; / * trigger event * else - mult; / * trigger event */ * respond to an event trigger * always ( add) out = a + b;/ * respond to an event trigger * always ( mult) out = a * b;endmodule在例子中,事件在例子中,事件add和和mult不是端口,但定不是端口,但定义为事件,它们没有对应的硬件实现。义为事件,它们没有对应的硬件实现。 是一种数据类型,能在过程块中触发一

41、个是一种数据类型,能在过程块中触发一个使能。使能。 在引用前必须声明在引用前必须声明 没有持续时间,也不具有任何值没有持续时间,也不具有任何值 只能在过程块中触发一个事件。只能在过程块中触发一个事件。 -操作符用来触发命名事件。操作符用来触发命名事件。a大于大于b,事件,事件add被触发,控制传递到等待被触发,控制传递到等待add的的always块。块。如果如果a小于或等于小于或等于b,事件,事件mult被触发,控制被触发,控制被传送到等待被传送到等待mult的的always块。块。行为描述举例行为描述举例在上面的例子中发生下面顺序的事件:在上面的例子中发生下面顺序的事件:1.等待等待set=

42、1,忽略时刻,忽略时刻10的的clk的的posedge。2.等待下一个等待下一个clk的的posedge,它将在时刻,它将在时刻30发生。发生。3.等待等待3个时间单位,在时刻个时间单位,在时刻33(30+3)置)置q=1。4.等待等待10个时间单位,在时刻个时间单位,在时刻43(33+10)置)置q=0。5. 等待在时刻等待在时刻48发生的发生的set=0。6. 等待在时刻等待在时刻70发生且与发生且与clk的上升沿同时发生的的上升沿同时发生的set=1。7.等等待待下下一一个个上上升升沿沿。时时刻刻70的的边边沿沿被被忽忽略略,因因为为到到达达该该语语句句时时时时间间已已经经过过去去了了,

43、如例子所示,如例子所示,clk=1。重要内容重要内容:在实际硬件设计中,事件:在实际硬件设计中,事件6应该被视为一个竞争(应该被视为一个竞争(race condition)。在仿)。在仿真过程中,值的确定倚赖于顺序,所以是不可预测的。这是不推荐的建模类型。真过程中,值的确定倚赖于顺序,所以是不可预测的。这是不推荐的建模类型。 always wait (set)begin ( posedge clk) #3 q = 1; #10 q = 0; wait (! set);end竞争RTL描述举例描述举例module dff (q, qb, d, clk); output q, qb; input

44、d, clk; reg q, qb; always ( posedge clk) begin q = d; qb = d; endendmodule下面的RTL例子中只使用单个边沿敏感时序控制。块语句块语句块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块语句用来将多个语句组织在一起,使得他们在语法上如同一个语句。块语句分为两类:块语句分为两类:顺序块:语句置于关键字顺序块:语句置于关键字begin和和end之间,块中的语句以顺序方式执行。之间,块中的语句以顺序方式执行。并行块:关键字并行块:关键字fork和和join之间的是并行块语句,块中的语句并行执行。之间的是并行块语句,块

45、中的语句并行执行。Fork和和join语语句句常常用用于于test bench描描述述。这这是是因因为为可可以以一一起起给给出出矢矢量量及及其绝对时间,而不必描述所有先前事件的时间。其绝对时间,而不必描述所有先前事件的时间。块语句(续)块语句(续)在顺序块中,语句一条接一条地计算执行。在顺序块中,语句一条接一条地计算执行。在并行块中,所有语句在各自的延迟之后立即计算执行。在并行块中,所有语句在各自的延迟之后立即计算执行。begin #5 a = 3; #5 a = 5; #5 a = 4;endfork #5 a = 3; #15 a = 4; #10 a = 5;join上面的两个例子在功能

46、上是等价的。上面的两个例子在功能上是等价的。Fork-join例子里的赋值故意打乱顺序是为例子里的赋值故意打乱顺序是为了强调顺序是没有关系的。了强调顺序是没有关系的。注意注意fork-join块是典型的不可综合语句,并且在一些仿真器时效率较差。块是典型的不可综合语句,并且在一些仿真器时效率较差。 延迟赋值语句延迟赋值语句begin temp= b; (posedge clk) a = temp;enda = ( posedge clk) b;语法:语法: LHS = RHS; 时序控制延迟的是赋值而不是右边表达式的计算。时序控制延迟的是赋值而不是右边表达式的计算。 在延迟赋值语句中在延迟赋值语

47、句中RHS表达式的值都有一个隐含的临时存储。表达式的值都有一个隐含的临时存储。 可以用来简单精确地模拟寄存器交换和移位。可以用来简单精确地模拟寄存器交换和移位。 等价语句等价语句LHS:Left-hand-sideRHS:Right-hand-side延迟赋值语句延迟赋值语句begin a = #5 b; b = #5 a; #10 $diplay(a, b);endfork a = #5 b; b = #5 a; #10 $diplay(a, b);join在在左左边边的的例例子子中中,b的的值值被被立立即即采采样样(时时刻刻0),这这个个值值在在时时刻刻5赋赋给给a。a的的值值在时刻在时刻

48、5被采样,这个值在时刻被采样,这个值在时刻10赋给赋给b。 注注意意,另另一一个个过过程程块块可可能能在在时时刻刻0到到时时刻刻5之之间间影影响响b的的值值,或或在在时时刻刻5到到时时刻刻10之间影响之间影响a的值。的值。在在右右边边的的例例子子中中,b和和a的的值值被被立立即即采采样样(时时刻刻0),保保存存的的值值在在时时刻刻5被被赋赋值值给给他们各自的目标。这是一个安全传输。他们各自的目标。这是一个安全传输。 注意,另一个过程块可以在时刻注意,另一个过程块可以在时刻0到时刻到时刻5之间影响之间影响a和和b的值。的值。并行语句在同一时间步发生,但由仿真器在另外一个时间执行。并行语句在同一时

49、间步发生,但由仿真器在另外一个时间执行。在下面的每个例子中,在下面的每个例子中,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; / 非阻塞过程赋值非阻塞过程赋值 b = a; / 交换交换a和和b

50、值值 endendmodule阻塞过程赋值执行完成后再执行在顺序块内下一条语句。阻塞过程赋值执行完成后再执行在顺序块内下一条语句。非非阻阻塞塞赋赋值值不不阻阻塞塞过过程程流流,仿仿真真器器读读入入一一条条赋赋值值语语句句并并对对它它进进行行调调度度之之后后,就就可以处理下一条赋值语句。可以处理下一条赋值语句。若过程块中的所有赋值都是非阻塞的,赋值按两步进行:若过程块中的所有赋值都是非阻塞的,赋值按两步进行:1.仿仿真真器器计计算算所所有有RHS表表达达式式的的值值,保保存存结结果果,并并进进行行调调度度在在时时序序控控制制指指定定时间的赋值。时间的赋值。2.在经过相应的延迟后,仿真器通过将保存

51、的值赋给在经过相应的延迟后,仿真器通过将保存的值赋给LHS表达式完成赋值。表达式完成赋值。阻塞过程赋值阻塞过程赋值非阻塞过程赋值非阻塞过程赋值过程赋值有两类过程赋值有两类非阻塞过程赋值(续)非阻塞过程赋值(续)module non_block1; reg a, b, c, d, e, f; initial begin / blocking assignments a = #10 1; / time 10 b = #2 0; / time 12 c = #4 1; / time 16 end initial begin / non- blocking assignments d = #10 1;

52、 / 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= x b= x c= x d= x e= 0 f = 110 a= 1 b= x c= x d= 1 e=

53、 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非阻塞过程赋值(续)非阻塞过程赋值(续)阻塞与非阻塞赋值语句行为差别举例阻塞与非阻塞赋值语句行为差别举例2module pipeMult(product, mPlier, mCand, go, clock);input go, clock;input 7:0 mPlier, mCand;output 15:0 product;reg 15:0 product;always (pose

54、dge go) product = repeat (4) (posedge clock) mPlier * mCand;endmodulemodule 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非阻塞过程赋值(续)非阻塞过程赋值(续)阻塞

55、与非阻塞赋值语句行为差别举例阻塞与非阻塞赋值语句行为差别举例2波形波形非阻塞非阻塞阻塞阻塞非阻塞过程赋值(续)非阻塞过程赋值(续)阻塞与非阻塞赋值语句行为差别举例阻塞与非阻塞赋值语句行为差别举例3module fsm(cS1, cS0, in, clock);input in , clock;output cS1, cS0;reg cS1, cS0;always (posedge clock) begin cS1 = in & cS0; /同步复位同步复位 cS0 = in | cS1; /cS0 = inendendmodulemodule fsm(cS1, cS0, in, clock);

56、input in , clock;output cS1, cS0;reg cS1, cS0;always (posedge clock) begin cS1 = in & cS0; /同步复位同步复位 cS0 = in | cS1; /同步置位同步置位endendmoduleDFF同步复位DFF同步置位DFF非阻塞过程赋值(续)非阻塞过程赋值(续)举例举例4:非阻塞赋值语句中延时在左边和右边的差别:非阻塞赋值语句中延时在左边和右边的差别module exchange; reg3:0 a, b; initial begin a=1; b=4; #2 a=3; b=2; #20 $finish;

57、end initial$monitor($time, t%ht%h, a, b); initial begin #5 a = b; #5 b = a; endendmodulemodule 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 a = #5 b; b 0) / 开始外层开始外层 if if (rega regb) / 开始内层第一层开始内层第一层 if result = reg

58、a; else result = 0; / 结束内层第一层结束内层第一层 if else if (index = 0) begin $display( Note : Index is zero); result = regb; end else $display( Note : Index is negative);if 和和 if-else 语句:语句:描述方式:描述方式:if(表达式)beginendelsebeginend条件语句(条件语句(case分支语句)分支语句)module compute (result, rega, regb, opcode);input 7: 0 rega,

59、 regb;input 2: 0 opcode;output 7: 0 result;reg 7: 0 result;always ( rega or regb or opcode) case (opcode) 3b000 : result = rega + regb; 3b001 : result = rega - regb; 3b010 , / specify multiple cases witht he same result 3b100 : result = rega / regb; default : begin result = bx; $display ( no match);

60、 end endcaseendmodulecase语句:语句:在Verilog中重复说明case项是合法的,因为Verilog的case语句只执行第一个符合项。条件语句条件语句-case语句语句case语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件语句。语句是测试表达式与另外一系列表达式分支是否匹配的一个多路条件语句。Case语句进行逐位比较以求完全匹配(包括语句进行逐位比较以求完全匹配(包括x和和z)。)。Default语句可选,在没有任何条件成立时执行。此时如果未说明语句可选,在没有任何条件成立时执行。此时如果未说明default,Verilog不执行任何动作。不执行任何动作

61、。多个多个default语句是非法的。语句是非法的。重要内容:重要内容:使用使用default语句是一个很好的编程习惯,特别是用于检测语句是一个很好的编程习惯,特别是用于检测x和和z。Casez和和casex为为case语句的变体,允许比较无关语句的变体,允许比较无关(dont-care)值。)值。case表达式或表达式或case项中的任何位为无关值时,在比较过程中该位不予考虑。项中的任何位为无关值时,在比较过程中该位不予考虑。在在casez语句中,语句中,? 和和 z 被当作无关值。被当作无关值。在在casex语句中,语句中,?,z 和和 x 被当作无关值。被当作无关值。case,:赋值语句

62、或空语句;,:赋值语句或空语句;default:赋值语句或空语句;case语法:语法:循环循环(looping)语句语句有四种循环语句有四种循环语句:repeat:将一块语句循环执行确定次数。:将一块语句循环执行确定次数。 repeat (次数表达式)次数表达式) while:在条件表达式为真时一直循环执行:在条件表达式为真时一直循环执行 while (条件表达式)条件表达式) forever:重复执行直到仿真结束:重复执行直到仿真结束 forever for:在执行过程中对变量进行计算和判断,在条件满足时执行:在执行过程中对变量进行计算和判断,在条件满足时执行 for(赋初值;条件表达式;计

63、算)赋初值;条件表达式;计算) 综合工具综合工具还不支持还不支持循环循环(looping)语句语句-repeatrepeat:将一块语句循环执行确定次数。:将一块语句循环执行确定次数。 repeat (次数表达式)次数表达式) 语句语句/ Parameterizable shift and add multipliermodule multiplier( result, op_a, op_b); parameter size = 8; input size:1 op_a, op_b; output 2* size:1 result; reg 2* size:1 shift_opa, resul

64、t; reg size:1 shift_opb; always ( op_a or op_b) begin result = 0; shift_opa = op_a; / 零扩展至零扩展至16位位 shift_opb = op_b; repeat (size) begin #10 if (shift_opb1) result = result + shift_opa; shift_opa = shift_opa 1; / Shift right end endendmodule为什么要说明一个shift_opb变量?. . .reg 7: 0 tempreg;reg 3: 0 count;.

65、. . count = 0; while (tempreg) / 统计统计tempreg中中 1 的个数的个数 begin if (tempreg 0) count = count + 1; tempreg = tempreg 1; / Shift right endend. . .循环循环(looping)语句语句while:只要表达式为真:只要表达式为真(不为不为0),则重复执行一条语句,则重复执行一条语句(或语句块或语句块).reg clk;initial begin clk = 0; forever begin #10 clk = 1; #10 clk = 0; endend.循环循环

66、(looping)语句语句forever:一直执行到仿真结束:一直执行到仿真结束 forever应该是过程块中最后一条语句。其后的语句将永远不会执行。应该是过程块中最后一条语句。其后的语句将永远不会执行。 forever语句不可综合,通常用于语句不可综合,通常用于test bench描述。描述。这种行为描述方式可以非常灵活的这种行为描述方式可以非常灵活的描述时钟,可以控制时钟的开始时描述时钟,可以控制时钟的开始时间及周期占空比。仿真效率也高。间及周期占空比。仿真效率也高。/ X检测检测for (index = 0; index in2) out = 2b01; else out = 2b10;

67、 initial #10 $finish;endmodule持续赋值持续赋值(continuous assignment)可以用持续赋值语句描述组合逻辑,代替用门及其连接描述方式。可以用持续赋值语句描述组合逻辑,代替用门及其连接描述方式。持续赋值在持续赋值在过程块外部使用过程块外部使用。持续赋值用于持续赋值用于net驱动。驱动。持续赋值只能在等式左边有一个简单延时说明。持续赋值只能在等式左边有一个简单延时说明。只限于在表达式左边用只限于在表达式左边用#delay形式形式持续赋值可以是显式或隐含的。持续赋值可以是显式或隐含的。语法:语法: #delay strength = ;wire out;

68、assign out = a & b; / 显式显式wire inv = in; / 隐含隐含持续赋值持续赋值(continuous assignment)(续续)module assigns (o1, o2, eq, AND, OR, even, odd, one, SUM, COUT, a, b, in, sel, A, B, CIN); output 7:0 o1, o2; output 31:0 SUM; output eq, AND, OR, even, odd, one, COUT; input a, b, CIN; input 1:0 sel; input 7:0 in; inp

69、ut 31:0 A, B; wire 7:0 #3 o2; / 没有说明,但设置了延时没有说明,但设置了延时 tri AND = a& b, OR = a| b; / 两个隐含赋值两个隐含赋值 wire #10 eq = (a = b); / 隐含赋值,并说明了延时隐含赋值,并说明了延时 wire 7:0 (strong1, weak0) #( 3,5,2) o1 = in; / 强度及延时强度及延时 assign o27:4 = in3:0, o23:0 = in7:4; / 部分选择部分选择 tri #5 even = in, odd = in; / 延时,两个赋值延时,两个赋值 wire

70、 one = 1b1; / 常数赋值常数赋值 assign COUT, SUM = A + B + CIN ; / 给级联赋值给级联赋值endmodule持续赋值的例子持续赋值的例子持续赋值持续赋值(continuous assignment)(续续)隐含或显式赋值隐含或显式赋值给任何给任何net类型赋值类型赋值给矢量给矢量net的位或部分赋值的位或部分赋值设置延时设置延时设置强度设置强度用级联同时给几个用级联同时给几个net类变量赋值类变量赋值使用条件操作符使用条件操作符使用用户定义的函数的返回值使用用户定义的函数的返回值可以是任意表达式,包括常数表达式可以是任意表达式,包括常数表达式in的

71、的值值赋赋给给o1,但但其其每每位位赋赋值值的的强强度度及及延延迟迟可可能能不不同同。如如果果o1是是一一个个标标量量(scalar)信信号号,则则其其延延迟迟和和前前面面的的条条件件缓缓冲冲器器上上的的门门延延迟迟相相同同。对对向向量量线线网网(net)的的赋赋值值上上的的延延迟迟情情况况不不同同。0赋赋值值使使用用下下降降延延迟迟,Z赋赋值值使使用用关关断断延延迟迟,所有其他赋值使用上升延迟。所有其他赋值使用上升延迟。上面的例子显示出持续赋值的灵活性和简单性。持续赋值可以:上面的例子显示出持续赋值的灵活性和简单性。持续赋值可以:持续赋值持续赋值(continuous assignment)

72、(续续)从从上上面面的的例例子子可可以以看看出出,持持续续赋赋值值的的功功能能很很强强。可可以以使使用用条条件操作符,也可以对一个件操作符,也可以对一个net多重赋值多重赋值(驱动驱动)。在在任任何何时时间间里里只只有有一一个个赋赋值值驱驱动动MUX2到到一一个个非非三三态态值值。如如果所有驱动都为三态,则果所有驱动都为三态,则mux2缺省为一个上拉强度的缺省为一个上拉强度的1值。值。 使用条件操作符的例子:使用条件操作符的例子:module cond_assigns (MUX1, MUX2, a, b, c, d); output MUX1, MUX2; input a, b, c, d;

73、assign MUX1 = sel = 2b00 ? a : sel = 2b01 ? b : sel = 2b10 ? c : d; tri1 MUX2 = sel = 0 ? a : bz, MUX2 = sel = 1 ? b : bz, MUX2 = sel = 2 ? c : bz, MUX2 = sel = 3 ? d : bz;endmodule复习复习问题:问题:在哪里放置在哪里放置always块?块?forever循环呢?循环呢?持续赋值通常给哪种类型的逻辑建模?持续赋值通常给哪种类型的逻辑建模?在在beginend之间使用非阻塞赋值和之间使用非阻塞赋值和forkjoin块有

74、哪些区别?块有哪些区别?Verilog中中posedge是什么意思?是什么意思?Verilog中存在哪些条件结构?中存在哪些条件结构?解答:解答:always是块语句,在是块语句,在module内使用。内使用。 forever循环是在过程块、循环是在过程块、task或或function内使用。内使用。持持续续赋赋值值只只能能给给组组合合逻逻辑辑建建模模,因因为为他他们们只只包包含含简简单单延延迟迟。过过程程块块可可以以包包含含和和wait时序控制。时序控制。forkjoin块块可以使用等式左边延迟可以使用等式左边延迟可可以以包包含含并并行行语语句句(循循环环,条条件件语语句句,任任务务,系系统

75、统任任务务,事事件件触触发发器器),不仅仅是并行赋值。,不仅仅是并行赋值。是典型的不可综合语句是典型的不可综合语句 posedge是任何可能从低到高的跳变(是任何可能从低到高的跳变(0-1,0-z,0-x,z-x,x-z,z-1,x-1)。)。Case、if-else语句以及语句以及?:条件操作符。条件操作符。第第1212章章 TUI调试调试进入交互式仿真模式进入交互式仿真模式控制并观察仿真控制并观察仿真浏览设计层次浏览设计层次检查(检查(checkpointing)和退出仿真)和退出仿真对设计进行临时修补对设计进行临时修补动态的单步及跟踪仿真动态的单步及跟踪仿真使用命令历史列表使用命令历史列

76、表学习内容:学习内容: 在本章中将学习用在本章中将学习用Verilog-XL TUI(Textual User Interface)和和NC Verilog TUI调试调试术语及定义术语及定义SHM 仿仿真真历历史史管管理理器器(Simulation History Manager)。一一个个管管理理由由SimWave显显示的仿真对象值数据跳变的工具示的仿真对象值数据跳变的工具CLIVerilog-XL命命令令行行界界面面(command line interface),通通过过它它你你可可以以控控制制仿仿真真并并对对Verilog过程语句执行调试操作过程语句执行调试操作Tcl工工具具命命令令

77、语语言言(Tool Command Language)。用用于于对对交交互互式式程程序序提提出出命命令令的脚本语言的脚本语言VCD (Value Change Dump)。存储对象值跳变数据的文件格式。存储对象值跳变数据的文件格式纵览纵览 什么是什么是CLI(Command Line Interface)?一个允许输入一个允许输入Verilog HDL过程命令的过程命令的Verilog-XL仿真器的仿真器的TUICLI命命令令是是一一个个Verilog过过程程语语句句或或语语句句块块。Verilog过过程程语语句句包包括括过过程程赋赋值值,循循环环,条条件件语语句句和和任任务务以以及及功功能能

78、调调用用。可可以以在在一一行行里里输输入入多多个个Verilog语语句句,语句之间由一个分号他开,如同在源代码中那样。语句之间由一个分号他开,如同在源代码中那样。Verilog-XL有有源源代代码码调调试试命命令令,这这些些命命令令不不在在IEEE规规范范中中,可可以以在在Verilog描描述中使用,但这不很必要。述中使用,但这不很必要。什么是什么是Tcl(Tool Command Language)一个对许多软件工具包括一个对许多软件工具包括NC Verilog的文本用户界面。的文本用户界面。NC Verilog仿真器的面向对象的仿真器的面向对象的TUI。一一个个Tcl命命令令包包括括一一个

79、个或或多多个个字字(命命令令名名,后后面面是是命命令令的的argument)。字字之之间间由空格或由空格或tab分隔。可以在一个命令行中输入多个命令,中间用分号分开。分隔。可以在一个命令行中输入多个命令,中间用分号分开。可以从网上、技术参考书或图书馆得到标准可以从网上、技术参考书或图书馆得到标准Tcl命令的信息。命令的信息。NC Verilog有专用标准有专用标准Tcl命令集扩展用于设计调试命令集扩展用于设计调试(在在ncsim命令窗口输入)。命令窗口输入)。本章将对大部分本章将对大部分NC Verilog专用扩展作简单描述。联机文档中有更详细解释。专用扩展作简单描述。联机文档中有更详细解释。

80、CLI和和Tcl命令可以在命令行交互式输入,也可以由源脚本或命令可以在命令行交互式输入,也可以由源脚本或keyfile输入。输入。注注意意:单单击击工工具具按按钮钮或或选选择择菜菜单单时时,SimVision GUI自自动动发发出出CLI和和Tcl命命令令作作出出响响应。应。在本章中将通过实际调试在本章中将通过实际调试CLI和和Tcl的实例来学习二者的界面。的实例来学习二者的界面。 进入交互模式进入交互模式 有三种方法中断仿真,进入交互模式:有三种方法中断仿真,进入交互模式:使用使用-s命令行选项在仿真前(时间命令行选项在仿真前(时间0)停止仿真,立即进入交互模式)停止仿真,立即进入交互模式在

81、仿真过程中输入一个在仿真过程中输入一个C异步中断异步中断到达一个断点或在源代码里的到达一个断点或在源代码里的$stop系统任务。系统任务。当中断当中断Verilog-XL时,仿真器进入交互式模式并给出提示符:时,仿真器进入交互式模式并给出提示符: C1 当中断当中断NC Verilog时,进入交互式模式并给出提示符时,进入交互式模式并给出提示符: ncsim 此此时时,仿仿真真器器暂暂时时挂挂起起。可可以以在在命命令令行行提提示示符符处处输输入入交交互互式式命命令令,然然后后继续仿真。继续仿真。进入交互模式进入交互模式 仿仿真真器器允允许许在在离离散散的的时时间间点点中中断断仿仿真真并并与与设

82、设计计进进行行交交流流。有有三三种种方方法法进进入入交交互模式:互模式:使用使用-s命令行选项在时间命令行选项在时间0停止仿真停止仿真输入一个输入一个C异步中断异步中断可可以以用用测测试试基基准准中中的的$stop系系统统任任务务使使仿仿真真在在指指定定的的时时间间(或或基基于于一一个个指指定定的的事件)进入交互式模式。事件)进入交互式模式。当仿真器被中断时,它进入交互式模式并给出输入命令的提示符。当仿真器被中断时,它进入交互式模式并给出输入命令的提示符。在在Verilog-XL CLI中中,可可以以输输入入任任何何可可以以放放在在一一个个过过程程块块内内的的语语句句,并并输入一些只用于调试环

83、境的特殊命令。输入一些只用于调试环境的特殊命令。在在NC Verilog Tcl界界面面中中,可可以以输输入入标标准准Tcl命命令令,Tcl的的NC Verilog扩扩展展,或将被传送到操作系统的或将被传送到操作系统的shell命令。命令。仿真只是暂时挂起。所有信号保持他们当前状态直到继续仿真。仿真只是暂时挂起。所有信号保持他们当前状态直到继续仿真。 退出仿真退出仿真 在在Verilog-XL中,退出仿真的方式有:中,退出仿真的方式有:在在交交互互式式窗窗口口中中输输入入$finish;或或$finish0|1|2。可可以以提提供供一一个个参参数数显显示示仿仿真真时时间和存储器间和存储器/CP

84、U使用统计。使用统计。在交互式窗口中按在交互式窗口中按D。仿真时在遇到源代码中的一个仿真时在遇到源代码中的一个$finish。在在NC Verilog中,仿真退出有下列途径:中,仿真退出有下列途径:在交互式提示符输入在交互式提示符输入$finish0|1|2在交互式提示符输入在交互式提示符输入exit在交互式提示符按连续按在交互式提示符按连续按D两次两次注注意意:在在NC Verilog中中,一一旦旦进进入入了了交交互互式式模模式式,如如果果继继续续仿仿真真并并在在源源代代码码中遇到一个中遇到一个$finish,则返回到交互式模式。,则返回到交互式模式。 如果以如果以batch模式(没有停止或

85、进入交互式模式)运行仿真,则当仿真器在源代码中遇到模式(没有停止或进入交互式模式)运行仿真,则当仿真器在源代码中遇到一个一个$finish时,仿真退出。时,仿真退出。在交互式模式中,在交互式模式中,Verilog-XL和和NC Verilog有不同工作方式:有不同工作方式:注:$finish0|1|2:0:没有输出;1:输出仿真时间和位置;2:输出仿真时间和位置;输出仿真时使用的存储器大小和CPU时间。退出仿真退出仿真 如如果果在在一一个个零零延延迟迟循循环环中中或或如如果果有有太太多多仿仿真真事事件件被被列列入入队队列列以以至至系系统统不不能能及及时时对对一一个个键键盘盘中中断断做做出出响响

86、应应,你你可可以以终终止止仿仿真真器器进进程程来来停停止止仿仿真真。如如果果仿仿真真继继续续运运行行,它它将将用用去去越越来越多的存储空间。在来越多的存储空间。在NC Verilog中,你可以选择重复使用中,你可以选择重复使用C(5或或6次)直到仿真停止。次)直到仿真停止。可以发送可以发送KILL信号给一个信号给一个UNIX进程来终止它,典型为进程来终止它,典型为|,或从另一个,或从另一个shell进程,输入:进程,输入: kill 9 pid 这里这里pid为仿真器进程的进程为仿真器进程的进程ID。可以用可以用Task Manager终止一个终止一个NT进程。进程。用用finish命令或命令

87、或$finish系统任务来退出仿真并返回控制到操作系统,可选择地显示仿真时系统任务来退出仿真并返回控制到操作系统,可选择地显示仿真时间和存储器间和存储器/CPU使用统计。使用统计。 用用Verilog-XL调试调试 下面是下面是IEEE标准标准Verilog过程命令,在调试时特别有用:过程命令,在调试时特别有用:force release $display $finish $history $incsave$input $list $monitor $realtime $reset $restart$scope $showscopes $showvars $stop $strobeVerilo

88、g-XL还提供了其它一些在调试时比较有用的命令还提供了其它一些在调试时比较有用的命令$db_breakafter|beforetime $db_breakonceatline $db_breakonceonnegedge$db_breakonceonposedge $db_breakoncewhen $db_delete|enable|disablebreak $db_delete|enable|disablefocus$db_cleartrace $db_help $db_setfocus $db_ settrace $db_showbreak $db_showfocus $db_step

89、time$cputime$deposit$history$showallinstances$showvariables; , : . ?注意:在交互模式下输入?或注意:在交互模式下输入?或$db_help显示调试命令的帮助,或查看联机文档显示调试命令的帮助,或查看联机文档用用Verilog-XL调试调试 一些系统任务的功能:一些系统任务的功能:$db_step 单步执行一条或多条语句单步执行一条或多条语句$db_steptime 执行指定的时间(执行指定的时间(units)$db_setfocus 指定指定$db_命令作用范围命令作用范围$db_disablefocus, $db_enable

90、focus, $db_ deletefocus 范围操作范围操作$db_settrace, $db_cleartrace 跟踪或取消跟踪跟踪或取消跟踪$db_breakatline 在一行之前或某个基本单元后设置断点在一行之前或某个基本单元后设置断点$db_breakbeforetime, $db_ breakaftertime 在在某某一一仿仿真真时时间间之之前前/之之后后设置断点设置断点$db_breakoncewhen 变量值发生变化设置断点变量值发生变化设置断点$db_breakonceonnegedge, $db_breakonceonposedge 信号沿断点信号沿断点$db_di

91、sablebreak, $db_enablebreak, $db_ deletebreak 断点操作断点操作$db_showbreak, $db_showfocus 显示断点显示断点NC Verilog调试调试 调试非常有用的标准调试非常有用的标准Tcl命令:命令:break case close concat eval exit forforeach format gets history if incr openputs return set source switch unset whilealias call database deposit describe driversfinis

92、h fmibkpt force help omi probeprocess release reset restart run savescope status stop task time valueversion whereNC Verilog提供的调试用的扩展提供的调试用的扩展Tcl命令:命令:注:在交互模式下,输入注:在交互模式下,输入help或或help 来获得帮助,或参考联机文档来获得帮助,或参考联机文档NC Verilog调试调试 这些命令的功能为:这些命令的功能为:deposit:给对象设置一个值:给对象设置一个值force:给对象强制赋值或维持原值。:给对象强制赋值或维持原值

93、。release:取消在对象上的强制赋值:取消在对象上的强制赋值database和和probe:SHM或或VCD数据库控制数据库控制value:显示信号值:显示信号值describe:显示仿真对象的信息:显示仿真对象的信息process:显示过程块信息:显示过程块信息time:显示当前仿真时间:显示当前仿真时间drivers:显示对象的详细驱动信息:显示对象的详细驱动信息scope:显示及游历模型层次信息:显示及游历模型层次信息run:执行、单步及跟踪一个仿真:执行、单步及跟踪一个仿真stop:多种类型断点处理:多种类型断点处理save:保存当前仿真的状态:保存当前仿真的状态reset:从:从

94、0开始重新仿真,开始重新仿真, restart:从上次保存的状态开始仿真:从上次保存的状态开始仿真status:显示仿真状态:显示仿真状态finish:结束仿真并显示仿真状态:结束仿真并显示仿真状态Verilog的断点的断点 在在交交互互模模式式中中,使使用用系系统统任任务务$stop或或其其它它源源代代码码级级调调试试任任务务设设置置、控控制制断断点点。输输入入点点“.”来继续仿真。来继续仿真。C1 #10 $stop; /10个时间单位后停止仿真个时间单位后停止仿真C2 forever ( posedge clk) $stop; /在在clk的每个上升沿停止仿真的每个上升沿停止仿真C3 .

95、C1: $stop at simulation time 10C3 if (en1 | en2) /如果如果en1或或en2不为不为0, ( negedge clk) /则在则在clk的每个时钟上升沿停止仿真的每个时钟上升沿停止仿真 $stop;C4 $db_ breakatline(7); /在当前模块的第七行停止仿真在当前模块的第七行停止仿真Set break (1) at line 7, scope test, file ulatch. vC5 $db_ showbreak; /设置断点,其编号为设置断点,其编号为1Status enabled break( 1) at line 7,

96、scope test, file ulatch. vC6 $db_ delete( 1); /删除断点删除断点1注意注意:所有命令要用:所有命令要用“;”结束,如同源代码。在命令执行结束后,仿真结束,如同源代码。在命令执行结束后,仿真器给出提示符器给出提示符“”Verilog的断点的断点 可以用延时再加上可以用延时再加上$stop设置一个简单断点设置一个简单断点可以使用可以使用Verilog语言的行为结构设置一个复杂断点。语言的行为结构设置一个复杂断点。设设置置断断点点之之后后,Verilog-XL不不会会自自动动继继续续执执行行。输输入入一一个个“.”来来继继续续仿仿真操作。真操作。交互式命

97、令输入完成后,交互式命令输入完成后,Verilog-XL才会以才会以“”代替代替Cn来响应。来响应。在在提提示示符符后后输输入入的的每每个个Verilog语语句句或或语语句句块块,Verilog-XL认认为为是是在在下下面面语句后输入的:语句后输入的: initial #($time) 也也就就是是说说, 输输入入的的任任何何过过程程语语句句或或在在一一个个begin/end块块中中的的几几个个语语句句集合,被安排在当前仿真时间发生。甚至可以使用一些编译器指令。集合,被安排在当前仿真时间发生。甚至可以使用一些编译器指令。 但但不不能能实实例例基基本本单单元元或或模模块块、设设置置timesca

98、le、声声明明一一个个任任务务、函函数数或或模模块块、对对一一个个线线网网(net)进进行行持持续续赋赋值值,或或输输入入一一个个新新的的initial或或always块。块。 NC Verilog断点断点 在交互模式时,使用stop命令来生成、命名、禁止、使能、删除或显示不同类型的断点。输入run来继续仿真。ncsim stop -time 10ns -delbreak 1 /10个时间单位后停止仿真个时间单位后停止仿真Created stop 1ncsim stop -condition # clk = 1 /在每个在每个clk时钟上升沿停止仿真时钟上升沿停止仿真Created stop

99、2ncsim run10NS + 0 (stop 1)ncsim if expr #en1 | expr #en2 /如果如果en1或或en2为为1, stop -condition # clk = 1 /在每个在每个clk时钟上升沿停止仿真时钟上升沿停止仿真Created stop 3ncsim stop -line 7 -name linbr /在当前范围第在当前范围第7行停止仿真,并命名这行停止仿真,并命名这个个Created stop 4 /断点的名字为断点的名字为linbrncsim stop -show2 Enabled Condition # clk = 13 Enabled C

100、ondition # clk = 1linbr Enabled Line: ./ ulatch. v: 7 (scope: test)ncsim stop -delete 2 /删除断点删除断点2ncsim stop -disable linbr /禁止命名断点禁止命名断点linbrncsim NC Verilog断点断点 在交互模式时,使用在交互模式时,使用stop命令来生成、命名、禁止、使能、删除或显示不同类命令来生成、命名、禁止、使能、删除或显示不同类型的断点。断点可以为条件、行、对象和时间。型的断点。断点可以为条件、行、对象和时间。设置断点后,仿真器不会自动继续执行。输入设置断点后,仿

101、真器不会自动继续执行。输入run来继续仿真。来继续仿真。输入交互命令时,输入交互命令时,Verilog-XL的提示符为的提示符为“”。完成后为。完成后为ncsim。如果使用完全访问,可以访问行,事件,值和连接信息,并修改信号值。如果使用完全访问,可以访问行,事件,值和连接信息,并修改信号值。显示及设置调试作用域显示及设置调试作用域使用系统任务$showscopes;或Tcl命令scopeshow显示当前级定义的作用域。 Directory of scopes at current scope level: module (adder), instance (u1) module (latch)

102、, instance (u2) Current scope is (top) Highest level modules: top使用系统任务使用系统任务$scope或或Tcl命令命令scope设置调试范围。设置调试范围。 C2 $scope(u1); ncsim scope u1使用使用CLI命令冒号命令冒号 ( : )或或Tcl命令命令where显示当前仿真位置显示当前仿真位置 Line 6, file ./ inter_bufif. v, scope (top) Scope is (top)显示及设置调试作用域显示及设置调试作用域刚进入交互模式时,当前调试范围为最高层。刚进入交互模式时,

103、当前调试范围为最高层。使用系统任务使用系统任务$scope改变调试范围到层次中指定改变调试范围到层次中指定(名字)级名字)级使使用用$scope命命令令设设置置当当前前范范围围,显显示示当当前前范范围围的的全全部部或或部部分分源源代代码码,或或显显示示一一个个特特定定范范围围的的信息。信息。使用使用$scope命令来改变调试范围到层次中命名的层次。命令来改变调试范围到层次中命名的层次。可以使用层次范围名。可以直接引用当前层次上定义的对象而无须他们的全部层次名。可以使用层次范围名。可以直接引用当前层次上定义的对象而无须他们的全部层次名。设计反编译设计反编译可以反编译当前范围(缺省)或一个命名的范

104、围。可以反编译当前范围(缺省)或一个命名的范围。 在在Verilog-XL中,使用中,使用$list系统任务。用系统任务。用-d命令行选项来反编译整个设计。命令行选项来反编译整个设计。 在在NC Verilog中,使用中,使用scope -list命令。命令。产生的输出在所有当前活动的过程语句旁边带有一个星号(产生的输出在所有当前活动的过程语句旁边带有一个星号(*)。)。 / mods. v 1 module dut( q, d, c); 2 output 2 q; / = 1h0, 0 3 input 3 d, / = St1 3 c; / = St0 4 reg 4 q; / = 1h0,

105、 0 5* always 6 begin 7 ( posedge c) 8 q $monitor(“%m %0d”, $time, “ o1 = %h”, o1);top 100.0 o1 = XC2 $display(“ Simulation took %g/ 10 seconds”, $cputime);Simulation took 6/ 10 secondsncsim describe o1 m1o1 wire (wire/ tri) = StXm1 instance of mod1ncsim value %h o11hxncsim time10 NS显示信号值显示信号值使使用用val

106、ue命命令令可可以以显显示示一一个个或或多多个个仿仿真真对对象象的的值值。可可以以用用$vlog_format设设置置变变量量的的缺缺省省显显示示格格式式。如如果果不不设设置置,它它缺缺省省为为%h。必必须须在在elaboration时将对象设置为可读取访问才能显示其值。时将对象设置为可读取访问才能显示其值。用用describe命令显示仿真对象的简短描述。命令显示仿真对象的简短描述。使使用用time命命令令显显示示当当前前仿仿真真时时间间。用用Tcl命命令令$display_unit设设置置时时间间单单位位,缺缺省省为为auto(最最大大的的基基准准,显显示示一一个个不不小小于于1的的时时间间

107、),并并包包括括delta周周期期记数(零延迟事件被传输的次数)。记数(零延迟事件被传输的次数)。 显示信号驱动显示信号驱动在在Verilog-XL中:中:使用系统任务使用系统任务$showvars或或$showvariables得到线网或寄存器的详细信息。得到线网或寄存器的详细信息。C1 $showvars( o1);o1 (top) wire = StX, schedule = StX HiZ - (top. m1): bufif1 g3( o1, i3, c3); schedule = St1 St1 - (top. m1): bufif1 g2( o1, i2, c2); St0 dr

108、ivers o1o1. wire (wire/ tri) = StX HiZ - (top. m1): bufif1 g3( o1, i3, c3) St1 - (top. m1): bufif1 g2( o1, i2, c2) St0 $reset; / 复位返回到仿真时间为复位返回到仿真时间为0时的状态时的状态 C2 force o1 = in1 | in2; . . . C14 release o1; /清除清除net或寄存器上所有强制值或寄存器上所有强制值注意:注意:可以用系统任务$list_forces列出所有当前活动的force。用$deposit系统任务在线网(net)或寄存器上

109、放置一个值(可以是0、1、x、z),这个值向前传播。可以用一个简单的赋值设置值。 $deposit( sig, 1); $deposit( bus, hAx2);信号保持其值直到下一次改变。例如: module patch; reg in; buf (tmp, in); buf (out, tmp); initial begin #5 in = 0; /in = 0; tmp = 0; out = 0; #5 $deposit (tmp, 1b1); /in = 0; tmp=1; out=1; #5 in = 1; /in=1; tmp=1; out=1; #5 in =0; /in=0;

110、tmp=0; out=0; #5 $finish; end endmodule这些系统任务Verilog-XL专用在在NC Verilog中修补设计中修补设计force和release命令用一个新值覆盖信号的驱动。 ncsim reset / resets the simulation to time zero ncsim force o1 = 1b0 ncsim . . . . . . ncsim release o1 -keepvalue注意:注意:force命令等号右边可以是一个表达式,但这个表达式只计算一次。用$deposit系统任务在线网(net)或寄存器上放置一个值(可以是0、1、

111、x、z),这个值向前传播。 ncsim deposit sig 1 ncsim deposit bus hAx2信号保持其值直到下一次改变。不能向由force赋值的信号进行deposit。注意:可以用scopelist命令列出当前范围的信号的所有驱动,包括当前活动的force。deposit不是一个驱动。在在NC Verilog中修补设计中修补设计reset命令将设计复位到仿真时刻0的逻辑状态。电路修补的通常用途为:将电路的部分或全部初始化设置电路到一个确定状态覆盖错误值使得仿真可以继续进行打断反馈循环并设置它到一个确定状态用force命令来在调试时临时修补设计。只能对全部寄存器或线网矢量和展

112、开后的向量线网的位或选择部分强制赋值。被赋的值必须为Verilog立即数。force覆盖所有其他驱动,并保持有效直到被其它Tcl或Verilog的force替代,或被Tcl或Verilog中的release取消。这个命令和Verilogforce语句等价。release命令取消Tcl或Verilog中一个或多个信号上的force。这个命令与Verilog-XLrelease语句等价。deposit命令设置指定的net,寄存器,存储器或存储元件的值。被赋的值必须为Verilog立即灵敏。设置的值的变化向前传输。要修补一个信号,必须已经在elaboration时将对象设置为写访问。跟踪仿真动态跟踪

113、仿真动态在NCVerilog中没有跟踪信息。在Verilog-XL中: $settrace和$cleartrace系统任务开启和关闭跟踪。 $db_settrace和$db_cleartrace系统任务在设计中关心部分开启和关闭跟踪。用-t选项使整个仿真过程中开启跟踪。C1 forever begin enable $settrace; #2 $cleartrace; $stop; endC2 .SIMULATION TIME IS 300L8 run_ ta. v: buf u4 XL GATE = St0L6 run_ ta. v: wire clk FROMXL NET = St0L12

114、 latch. v (run_ ta. u3): ( negedge enable) CONTINUEL13 latch. v (run_ ta. u3): r1 = #( 1) data; = #( 32h1, 1) 1hx, x;C1: #2 CONTINUEC1: $cleartrace;跟踪仿真动态跟踪仿真动态用$settrace和$cleartrace系统任务来开启和关闭仿真跟踪。用-t选项来为整个仿真来开启跟踪跟踪显示事件、文件名以及在源描述的行号。仿真跟踪在将一个时序问题追踪到一个小时间窗口时,例如一个竞争情况,非常有用。注意:注意:这些系统任务为Verilog-XL仿真器专用。

115、NCVerilog没有一个跟踪模型。跟踪仿真动态跟踪仿真动态在在Verilog-XL中,单步跟踪可以为:中,单步跟踪可以为:分号(;)单步执行仿真逗号(,)单步执行仿真并跟踪$db_step单步仿真,跳过所有不在调试范围内的部分$db_steptime仿真指定的时间。C1 , /单步执行并跟踪单步执行并跟踪C1: foreverC1 ,C1: beginC1: selC2 ; /单步仿真,没有跟踪,除非使用单步仿真,没有跟踪,除非使用$settrace或或-t在在NC Verilog中,单步跟踪可以为:中,单步跟踪可以为:run step:单步仿真,执行每一个语句。run- next:单步仿真

116、,执行每个语句并跳过子程序调用(任务和函数)。run timeval:运行仿真一段指定的时间。跟踪仿真动态跟踪仿真动态如果没有指定范围并开启了跟踪,分号、逗号和如果没有指定范围并开启了跟踪,分号、逗号和$db_step 等价。等价。 run命令开始仿真或继续一个以前暂停的仿真。仿真根据指定的参数进行。时命令开始仿真或继续一个以前暂停的仿真。仿真根据指定的参数进行。时间可以是相对或绝对的。使用不带参数的间可以是相对或绝对的。使用不带参数的run命令运行仿真直到结束或直到一个命令运行仿真直到结束或直到一个断点或发生一个错误。断点或发生一个错误。 命令历史列表命令历史列表C4 $history;Co

117、mmand history:C1* forever ( posedge clk) $stop;C2 $list;C3 $display( clear);C4* $history;C5 -1C6 2处于活动状态的命令由处于活动状态的命令由(*)标记标记系统任务$history或Tcl命令history可以列出以前执行的交互命令。在NCVerilog中输入!命令编号命令编号或history redo -命令编号命令编号可以重新执行命令。在Verilog-XL中,输入命令编号命令编号重新执行命令或-命令编号命令编号取消命令。ncsim history1 stop -time 10ns -delbre

118、ak 12 stop -condition # clk = 13 run4 if # en1 | #en2 stop -condition # clk= 1 5 stop -line 7 -name linbr6 stop -show7 stop -delete 28 stop -disable linbr9 historyncsim history redo 2Created stop 2Verilog-XLNCVerilog用history命令修改历史机制将保持的命令数来重新执行一个指定的以前的命令,并在重新执行前替代一个以前命令的一些部分。history命令是一个标准Tcl命令。保存及重

119、启动仿真保存及重启动仿真在Verilog-XL中,可以在交互式模式或在源代码中使用下列命令:$save和$incsave命令保存整个仿真数据结构。$restart或-r命令行选项可以从保存时间重新开始仿真。这样可以不必重新编译并重新仿真到该时间点。$reset重新设置仿真状态到时刻0的状态。系统任务$history或Tcl命令history可以列出以前执行的交互命令。C1 #500 $save(“save.dat”); / 在在500 ns后保存仿真后保存仿真C2 forever #100000 / 每个每个100000 ns后后 $incsave(“ inc. dat”); / 增量式保存仿

120、真增量式保存仿真在NCVerilog中使用这些Tcl交互命令:save和restart保存并从一个仿真snapshot重新开始。reset重新从时刻0snapshot开始。由于NCVerilog总是保存所有数据,snapshot只是简单的保存初始值。这使保存和重新开始更快更可靠。 ncsim stop -time 100000NS -execute save try1 ncsim restart try1保存及重启动仿真保存及重启动仿真可以将仿真数据结构保存到一个文件并在以后再次启动仿真。用这个特性可以定点检查一个长仿真并:在机器崩溃时保护仿真(machinefailure)执行快速“what

121、if”关系统任务$save保存仿真数据结构。提供一个文件名参数用于存储仿真数据结构。系统任务$incsave进行增量保存。增量保存使用较少空间。系统任务$restart或-r命令行选项从一个以前保存的数据结构重新开始仿真。需要提供储存仿真数据结构的文件名作为参数。注意使用-r 命令行选项时,不用指定设计文件。仿真器执行一个过程语句中间不能保存。用run -clean到达仿真中的下一个“clean”点,然后执行save命令。可以以后重新装载snapshot继续仿真;Tcl环境的状态(包括指针)并不和snapshot一起保存。要保存Tcl环境,必须单独执行一个save -environment。要

122、从储存的Tcl环境restart,必须编编译译保存的环境文件。在在Verilog-XL中执行中执行playing back TUI命令命令系统任务$input或-i命令行选项可以执行一个脚本文件。仿真器在交互模式下执行命令脚本。verilog mods. v -i keyfile. txt -q s /在交互模式下,并在时间在交互模式下,并在时间0执行执行keyfile.txtC1 $display( Executed keyfile at %g,$ realtime);Executed keyfile at 0C2 begin $input(“ keyfile. txt”); #10 $st

123、op; end . /停止时执行停止时执行keyfile.txtC2: $stop at simulation time 10C3 $display( Executed keyfile at %g,$ realtime);Executed keyfile at 10C4 keyfile. txt$display( Executed keyfile at %g,$ realtime);注意:注意:在交互式模式下,begin和end之间语句顺序执行。通常的,在交互模式提示符处输入的语句在仿真继续进行时为并行执行。在在Verilog-XL中重新执行中重新执行TUI命令命令仿真器将交互命令写到一个ke

124、y文件(keyfile),其缺省名为verilog.key。可以用-k选项重新命名key文件。可以用$input系统任务或用-i命令行选项开始Verilog-XL,读取并执行一个包含交互式命令的文件,例如该key文件。仿真器在交互模式下读取并执行keyfile。在在NC Verilog中重新执行中重新执行TUI命令命令在交互模式中使用source file_name命令或+tcl+file_name命令行选项执行一个Tcl命令脚本,或keyfile。ncverilog mods. v +tcl+ commands. tcl -s +access+ rwcncsim run 2NSncsim c

125、oncat Executed keyfile at eval time NSExecuted keyfile at 2 NSncsim source commands. tclncsim run 2NSncsim concat Executed keyfile at eval time NSExecuted keyfile at 4 NScommands. tclrun 2NSconcat Executed keyfile at eval time NS进入交互模式,并在时间0执行keyfile在在NC Verilog中重新执行中重新执行TUI命令命令仿真器将交互命令写入一个key文件,缺省名

126、为ncsim.key。可以用-k选项来重新命名key文件。在交互模式中输入 save -commands tcl_file 或或 save-environment tcl_file 来保存一个拷贝。可以输入sourse tcl_file命令或+tcl+tcl_file或+ncinput+tcl_file或+nckeyfile+tcl_file命令行选项重启仿真器,读取并执行一个含有交互命令的文件,例如key文件。Source命令只显示最后一个执行的命令的结果。Verilog-XL选项-i被忽略。建立波形数据库建立波形数据库在Verilog-XL交互模式下创建并操作一个波形数据库,使用数据库类型

127、相关的系统任务。在NCVerilog交互模式下创建一个波形数据库,使用以下命令:打开、禁止、使能、关闭或显示SHM或VCD数据库的信息:database-options例如,打开数据库mywaves.shm并命名其波形:ncsim database -open waves -into mywaves. shm创建、禁止、使能、删除或显示探针的信息:probe-options例如,探测从实例u1到页单元的所有端口到一个SHM数据库,命名探针为seek,并打开波形工具: ncsim probe -create -name peek u1 -ports -depth to_ cells -waves

128、例如,监视被探测的信号rega并将其值打印到一个文件: ncsim probe -screen u1. rega -redirect mon_rega. txtdatabase命令打开、关闭、禁止或使能一个SHM或VCD数据库,或显示有关信息。probe命令创建、删除、禁止、使能或显示一个指针。当被探测时,对象值的每一个变化都被保存到一个数据库。其它其它Tcl命令命令alias-options设置、取消或显示一个仿真命令别名 ncsim alias -set go run 10 ns; value sumcall-systftask_name-options调用用户自定义系统任务或函数(PLI

129、应用) ncsim call $myprinter set value to 8hcprocess确定正在执行或将要安排执行的过程块。status显示资源使用和仿真时间。 ncsim statustask用名字调用一个Verilog任务。version显示仿真器的版本。其它其它Tcl命令命令Alias命令是一个标准Tcl命令。可以设置、取消或显示一个仿真命令别名call命令调用一个用户自定义系统任务或函数(Verilog),或一个C-接口函数(VHDL)。插入-systf或-predefined选项在协同执行Verilog和VHDL仿真时区分名字相同的函数。process命令确定正在执行或将要

130、安排执行的过程块(或VHDL过程)。status命令显示存储器使用、CPU使用和仿真时间。task命令调用一个Verilog任务。注意不能用这个命令调用一个Verilog函数或系统任务/函数。要传递参数值给该任务,在调用之前在其输入和双向端口deposit值。例如,如果任务test的输入为N,则可以用如下方法调用它: ncsim deposit test.N 1; task test用version命令来显示仿真器版本。总结总结在这一章学习了:控制并观察仿真进入交互仿真模式浏览设计层次设置断点显示信号波形点检测(checkpointing)、退出及重新启动仿真临时修补设计单步和跟踪仿真行为使用

131、命令历史列表复习复习问题:问题:1.怎样创建自己的命令使仿真前进怎样创建自己的命令使仿真前进1ns并显示一个寄存器的内容?并显示一个寄存器的内容?2.怎样进入交互模式?怎样进入交互模式?3.可以用什么命令来设置缺省当前范围层?可以用什么命令来设置缺省当前范围层?4.怎样得到一个信号的当前值?怎样得到一个信号的当前值?5.解释在每个仿真器内解释在每个仿真器内deposit和和force之间的区别。之间的区别。6.在在Verilog源源代代码码中中,是是否否当当ncsim遇遇到到$finish系系统统任任务务时时就就会会终终结并返回到主提示符?结并返回到主提示符?解答解答:除非特别注明,以除非特别

132、注明,以$开头的命令用于开头的命令用于Verilog-XL,其他命令用于,其他命令用于NC Verilog。1.在在Tcl中中,可可以以使使用用alias命命令令创创建建一一个个命命令令。例例如如:alias -set go1 run 1 ns; value reg12. 在在Verilog-XL中中,可可以以为为命命令令定定义义一一个个文文本本宏宏。例例如如:define set #1 $display( reg1); .2.用用-s命令行选项,按命令行选项,按C或在源代码中遇到或在源代码中遇到$stop。3.用用$scope 或或scope来设置缺省当前范围层。来设置缺省当前范围层。4.用

133、用$display,value或或describe。可可以以用用$showvars或或drivers获获得得一一个个信信号号的的值值和和强强度度,以以及它的所有驱动。及它的所有驱动。5.在在两两个个仿仿真真器器中中,force保保持持一一个个值值直直到到它它被被release,而而一一个个deposited值值保保持持其其值值仅仅到到信信号号更更新新。在在Verilog-XL中中,force命命令令使使force节节点点减减速速,但但可可以以在在一一个个表表达达式式和和一一个个信信号号之之间间创创建建一一个个连连续续关关系系。它它可可以以为为一一个个位位或或部部分分赋赋值值,而而$deposi

134、t只只能能影影响响整整个个线线网网或或寄存器。寄存器。6.是的,除非已经进入交互模式。在这种情况下,将返回到交互式提示符。是的,除非已经进入交互模式。在这种情况下,将返回到交互式提示符。第第1313章章 使用图形调试环境使用图形调试环境学习内容:学习内容:这一章将学习有关这一章将学习有关SimVision图形环境:图形环境:1.SimControl2.Navigator3.Signal Flow Browser (SFB):信号流浏览器:信号流浏览器4.Watch Objects Windows:对象观察窗口:对象观察窗口术语及定义术语及定义SimControl:图图形形仿仿真真器器接接口口;

135、用用SimControl来来推推进进或或中中断断仿仿真真,打打断断并改变仿真,控制范围,等等。并改变仿真,控制范围,等等。SignalScan:SimControl图形波形观察器图形波形观察器Navigator:显示设计层次和一个范围内对象信息的图形工具:显示设计层次和一个范围内对象信息的图形工具Signal Flow Browser(SFB):在在设设计计中中从从一一个个信信号号反反向向跟跟踪踪到到其其驱驱动动源源的的图形工具图形工具Watch Objects Windows :监视信号组及其值的窗口:监视信号组及其值的窗口Object:在:在SimControl中,任何一个信号或范围中,任

136、何一个信号或范围Double-click:将光标放在一个项目上并快速点击鼠标左键两次:将光标放在一个项目上并快速点击鼠标左键两次Right-select:将光标放在一个项目上并点击鼠标右键:将光标放在一个项目上并点击鼠标右键启动图形环境启动图形环境使用命令行选项+gui启动SimControl。在SimControl中可以访问SimVision所有部件。仿真器在SimControl主窗口的控制下运行。当第一次启动时,SimControl主窗口显示顶层模块的源代码。可以从SimControl工具菜单或工具栏访问SimVision环境(SignalScan,Navigator,SignalFlow

137、Browser及WatchObjectswindows)的其他部件。SimControl包括包括8个下拉菜单个下拉菜单固定菜单按钮可以快速访问固定菜单按钮可以快速访问常用命令常用命令一个空的用户可定义按钮一个空的用户可定义按钮当前仿真时间当前仿真时间显示正在调试的模块的源代显示正在调试的模块的源代码,可以选择这个区域的文码,可以选择这个区域的文本,但不能编辑本,但不能编辑显示范围并浏览。在同一时显示范围并浏览。在同一时间只能显示一下范围。若一间只能显示一下范围。若一个模块在多个文件出现,可个模块在多个文件出现,可以在以在subscope选择文件选择文件显示交互仿真的输出。可以显示交互仿真的输出

138、。可以提示符处输入交互命令提示符处输入交互命令显示信息,如仿真器的状态。显示信息,如仿真器的状态。详细的菜单命令及其它详细的菜单命令及其它SimVision细节请参考联机文档细节请参考联机文档后处理环境后处理环境在仿真并将探测信号放到一个SHM数据库之后,可以对设计进行后处理。可以从GUI或通过使用+ppe选项进入后处理模式。打开仿真当前设计时生成的SHM数据库。交互及后处理交互及后处理时间只能向前推进。可以读取并修改仿真值,访问连接并设置行断点,取决于使能的是何种访问。可以将值保存到一个波形数据库。可以执行交互命令和源交互式脚本。可以保存、重新开始、重新设置、运行和停止仿真。在后处理模式中:

139、可以扫描、单步、执行,或按时间向前或向后跳转。可以读取仿真值并访问连接,取决于在仿真过程中使能的访问及在波形数据库中保存的信息。用+gui选项启动SimVision时,进入仿真器交互模式。进入后处理模式时,将仿真器释放并对保存在波形数据库中的值进行操作。在交互模式中:SimControl菜单及工具条菜单及工具条编辑源文件,打开数据库,和查找文本。在交互模式中,还可以source命令文件、保存并重新开始仿真。执行、单步、停止和复位到开始时刻。在后处理模式中,还可以向后执行,并可以向前或向后扫描。设置并显示断点和范围。在交互模式中,还可以设置并显示forces和探针选择范围,端口和信号。启动其他S

140、imVision工具。按照用户的意愿调整SimControl的行为SimControl下拉菜单和固定菜单按钮可以:Source BrowserSource Browser显示在当前调试模块的源代码。显示在当前调试模块的源代码。可以在可以在Source Browser中选择任意对象(寄存器,中选择任意对象(寄存器,net,实例或线),实例或线)在在Source Browser中右击一个对象或行号弹出可以对该对象或行进行操作的命令菜单中右击一个对象或行号弹出可以对该对象或行进行操作的命令菜单选择对象选择对象在SimVision环境中,选择和弹出菜单使鼠标成为一个有力的工具。左键可以在所有SimVi

141、sion窗口中选择对象右击鼠标右键选择对象可以弹出一个菜单。按住Control键再按左键可以选择多个对象或取消选择。中键可以在窗口之间拖动对象选择对象选择对象在一个SimVision窗口选择一个或多个对象时,其他SimVision窗口的这些对象也均被选择。当右击选择一个对象时,弹出一个弹出菜单,包含用于该对象的一组常用命令。在不同的SimVision工具中弹出的不同的菜单。还可以在源浏览器中右击选择一个行号。按control键并用鼠标左键点击一个对象,可以选定该对象而不影响其他被选对象。添加选择:选择一个对象后,可以选择其它更多对象。取消选择:当一个对象被选定,可以用这个办法来取消对它的选择。

142、点击拖动:当用鼠标中间的按钮选择一个对象时,可以拖动这个对象到另一个位置。如果鼠标只有两个按钮,可以用左键点击拖动。设置断点设置断点在下面的对话框中可以设置、使能、取消、列出,和删除断点。断点可可以是仿真时间、值的改变、条件或代码行。断点的功能视仿真器而不同。设置断点设置断点断点是使仿真停止的事件。有三种类型的断点:基于时间:当仿真到一个指定时间停止。此为缺省。基于行:当仿真到到源代码一个指定的行时停止。必须指定范围,文件名,和行号。只用于交互模式。基于对象:当指定信号的值发生变化或指定跳变发生时停止。在NCVerilog中,不能指定一个单一跳变。基于条件:当指定的Tcl表达式值为真时停止。S

143、imControl提供四种设置断点的方法:在菜单选择Set-Breakpoints在Show-Breakpoints对话框,按Set按钮。按Set Breakpoints按钮(只用于基于对象的断点设置)。在任何一个SimControl窗口中右击选择一个信号名,弹出一个有Set Break的菜单。Navigator用navigator来查看设计层次和当前范围的对象。要启动navigator,在SimControl窗口使用Tools菜单下Navigator,或按navigator按钮Navigator工具条是主窗口工具条的子集Navigator浏览设计层次时,navigator生成一个树结构,在这

144、个树结构中每个节点为设计层次中一个范围。双击一个没有展开的节点以显示子层双击一个展开的节点隐藏子层在navigator中有两种方法设计当前范围(scope):选择一个节点,然后按Scope按钮,或者在SimControl窗口中选择Set-Scope。右击选择一个节点并从弹出菜单中选择Set Debug Scope,或双击该节点。注注意意:由于所有SimVision窗口交互作用,从任何SimVision窗口设置范围时,该范围的源代码自动读入源浏览器sourcebrowser。用Options菜单设置显示选项可以隐藏范围树或对象列表。启动ObjectListOptions框或ScopeTreeOp

145、tions框指定显示及每个区域的内容。Signal Flow Browser(信号流浏览器)(信号流浏览器)使用信号流浏览器signalflowbrowser跟踪信号的驱动,设置信号属性。可以从SimControl启动信号浏览器SFB:菜单条:通过选择Tools-Signal Flow Browser工具条:通过选择SignalFlowBrowser按钮SFB的工具条包括:主窗口工具条的子集TraceBack:跟踪选择信号,代替当前跟踪StackView和TraceView翻转SFB外观右图是一个StackView形式Signal Flow Browser(信号流浏览器)(信号流浏览器)信号流

146、浏览器可以交互地跟踪一个信号的驱动以及对这些驱动所起的作用选择一个将被跟踪的信号:打开信号流浏览器前:在源浏览器中选择信号。在任何窗口中所做的选择会传递到其他所有窗口打开信号流浏览器后:在Trace区输入一个层次信号名。在其他Simvision窗口中选择一个信号并用鼠标中键将其拖到信号流浏览器中。Signal Flow Browser(信号流浏览器)(信号流浏览器)信号流浏览器(SFB)是一个高效的设计调试环境。用SFB可以从一个行为反常的信号开始,向后跟踪其驱动和作用信号直到发现行为反常的原因。信号流浏览器可以执行下面操作:以选择的基数显示一个信号的值。显示信号的驱动。查看信号的输入或驱动的

147、细节。显示所有对一个驱动起作用的信号。跟踪一个模块端口到一个较低的层次。Signal Flow Browser(信号流浏览器)(信号流浏览器)必须首先选择要跟踪的信号并将它输入或点击拖放到SFB中。此时出现一个驱动器(Driver)框,显示出所有该信号的驱动。可以在一个Driver框里跟踪任何驱动并显示其输入;或者通过首先选择该驱动器,然后从菜单中选择Trace-Show Inputs;或者简单地双击该驱动。可以在一个ContributingSignal框中跟踪任何信号以显示其所有驱动,或者通过首先选择该信号,然后从菜单总选择Trace-Show Drivers;或者简单地双击该信号。如果一个

148、信号的驱动为一个模块实例的端口,可以跟踪它并显示在这个模块实例内部的信号源。首先选择该驱动器,然后从菜单中选择Trace-Descend。例如,如果在一个驱动器框中有下面这个模块实例: register r1(. r( reg_ out) .)选择reg_out并使用Trace-Descend将显示r为信号源。可以通过首先选择该驱动器,然后从菜单中选择View-Driver Info显示一个驱动的细节.Watch Objects Windows(信号观察窗口)(信号观察窗口)可可以以打打开开任任意意多多个个对对象象观观察察窗窗口口。每每个个窗窗口口包包含含一一个个信信号号表表和和当当前前仿真值

149、。仿真值。要要在在一一个个对对象象观观察察窗窗口口中中添添加加对对象象,用用点点击击信信号号并并拖拖动动或或按按Add Objects.可可以以重重新新命命名名、锁锁定定、删删除除、关关闭闭,iconify,或或克克隆隆每每个个对对象象观观察窗口。察窗口。点点击击Find Next Edge 使使仿仿真真到到下一个跳变。下一个跳变。Watch Objects Windows(信号观察窗口)(信号观察窗口)打开多个观察窗口打开多个观察窗口每个观察窗口在关闭时会自动保存。每个观察窗口在关闭时会自动保存。可可以以打打开开一一个个新新窗窗口口或或一一个个以以前前保保存存过过的的窗窗口口。打打开开的的第

150、第一一个个窗窗口口缺缺省省名名“View1”。第二个窗口为。第二个窗口为“View2”,依次类推。,依次类推。可以重新命名一个窗口。可以重新命名一个窗口。可以克隆一个窗口,生成一个完全拷贝。可以克隆一个窗口,生成一个完全拷贝。要要从从另另一一个个SimVision窗窗口口添添加加对对象象到到一一个个观观察察窗窗口口,用用点点击击拖拖动动或或者者选选择择它它们然后按们然后按Add Objects。添加一个信号是将其添加到观察列表中。添加一个信号是将其添加到观察列表中。添加一个范围是添加在此范围中的信号到观察列表。添加一个范围是添加在此范围中的信号到观察列表。用观察窗口的选项(用观察窗口的选项(O

151、ption)菜单为每个窗口定制信号命名和值显示的方式。)菜单为每个窗口定制信号命名和值显示的方式。Find Next Edge 使使仿仿真真前前进进到到一一个个信信号号的的下下一一个个跳跳变变,或或到到下下一一个个用用户户设设置的断点。置的断点。Lock 可可以以锁锁定定一一个个观观察察窗窗口口,使使它它不不会会随随时时间间更更新新其其显显示示。不不能能向向一一个个被被锁锁定定的的窗窗口口添添加加新新信信号号或或从从它它前前进进时时间间。当当解解锁锁后后,它它将将立立即即更更新新到到反反映映当当前时间的当前值。前时间的当前值。Time区在后处理模式中可编辑,并只为该特定观察窗口改变时间值。区在

152、后处理模式中可编辑,并只为该特定观察窗口改变时间值。 总结总结这一章学习了这一章学习了SimVision图形环境:图形环境:SimControlNavigatorSignal Flow Browser(SFB)信号流浏览器信号流浏览器Watch Objects Windows复习复习问题问题1.SimVision的五个主要基于窗口的元件是什么?的五个主要基于窗口的元件是什么?2.怎样显示设计层次?怎样显示设计层次?3.怎样在你的设计中显示和监视一组信号?、怎样在你的设计中显示和监视一组信号?、4.可以从观察对象窗口中在一个对象上设置一个断点?可以从观察对象窗口中在一个对象上设置一个断点?5.怎

153、样确定一个驱动的作用信号?怎样确定一个驱动的作用信号?解答:解答:1.SimVision的的五五个个主主要要基基于于窗窗口口的的元元件件为为SimControl,Navigator,Watch Objects,Signal Flow Browser和和SignalScan 波形观察器。波形观察器。2.可可以以用用navigator显显示示并并在在设设计计层层次次中中浏浏览览。Navigator显显示示范范围围,对对象象和和对对象值。可以在象值。可以在Source Browser中显示每个范围的源代码。中显示每个范围的源代码。3.可以用对象观察窗口查看一组信号及其值。可以用对象观察窗口查看一组信号及其值。4.是是的的,可可以以从从对对象象观观察察窗窗口口在在一一个个对对象象上上设设置置一一个个断断点点,或或可可以以用用Find Next Edge按钮高效地设置一个断点,仿真并去除断点。按钮高效地设置一个断点,仿真并去除断点。5.可可以以通通过过用用信信号号流流浏浏览览器器跟跟踪踪一一个个驱驱动动的的作作用用信信号号来来找找出出这这些些信信号号。这这在在确确定定一一个个问问题题信信号号的的源源头头很很有有用用。可可以以反反向向跟跟踪踪驱驱动动及及其其作作用用信信号号直直到到发发现与预期行为不同信号。现与预期行为不同信号。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号