精品ppt语法要点详细讲解课件_第1页
精品ppt语法要点详细讲解课件_第2页
精品ppt语法要点详细讲解课件_第3页
精品ppt语法要点详细讲解课件_第4页
精品ppt语法要点详细讲解课件_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

语法要点详细讲解语法要点详细讲解 有关测试模块编写的语法有关测试模块编写的语法 ; 语法的高级部分:语法的高级部分: 函数、任务、文件、存贮器建立模型、函数、任务、文件、存贮器建立模型、 双向总线、双向总线、UDPUDP、综合指令。、综合指令。 语法详细讲解 Verilog测试模块的编写 目的: 复习如何编写较复杂的测试文件,对所做的设 计 进行完整的测试和验证。 掌握组织模块测试的常用方法;学会编写常用 的 测试代码。 语法详细讲解 用Verilog设计的步骤 注:虚线表示编译器能检查输入文件的可读性和是否存在以及是否允许生成输出文 件 include 文件 设计文件 厂家元件 库文件 输入文件: 激励和期望 的输出信号 输出文件:激 励和实际输出 的信号 编译器 仿真器 仿真器 语法详细讲解 测试平台的组成 激励 信号 需要验证的 设计 激励信号 和用于验 证的结果 数据 需要验证的 设计 简单的测试平台 复杂的测试平台 语法详细讲解 并行块 在测试块中常用到forkjoin块。用并行块能表示以同一个时间起点算起的多个事 件的运行,并行地执行复杂的过程结构,如循环或任务。举例说明如下: module inline_tb; reg 7:0 data_bus; initial fork data_bus= 8b00; #10 data_bus = 8h45; /这两个repeat开始执行时间不同,但能同时运行 #20 repeat (10) #10 data_bus = data_bus +1; #25 repeat (5) # 20 data_bus = data_bus )$random; $random(); 举例如下:举例如下: module tmodule t; integer r_seedinteger r_seed; rom m1(data, addr); rom m1(data, addr); . initial r_seed=2; initial r_seed=2; always (posedge clk) always (posedge clk) addr = $random(r_seed) %1024; addr = $random(r_seed) %1024; . / /用来测试地址为用来测试地址为0 0到到10241024之间任意值时的之间任意值时的RomRom。 endmoduleendmodule 语法详细讲解 文件的使用文件的使用 语法要点语法要点:$fopen(“$fopen(“文件名文件名“) “); file_handlefile_handle=$fopen(“=$fopen(“文件名文件名“) “); / /标准的输出显示器标准的输出显示器 descriptor=32h0000_0001(bit 0 set) descriptor=32h0000_0001(bit 0 set) integer handle1, handle2;integer handle1, handle2; initial begininitial begin handle1= $fopen(“file1.out“); /bit 1 set handle1= $fopen(“file1.out“); /bit 1 set handle2= $fopen(“file2.out“); /bit 2 set handle2= $fopen(“file2.out“); /bit 2 set handle3= $fopen(“file3.out“); /bit 2 set handle3= $fopen(“file3.out“); /bit 2 set end end 语法详细讲解 写到文件中去 语法要点:语法要点: $fdisplay ( ,p1,p2,.pn);p1,p2,.pn); $fmonitor ( ,p1,p2,.pn);p1,p2,.pn); integer desc1,desc2,desc3;integer desc1,desc2,desc3; initial begin desc1=handle1|1;initial begin desc1=handle1|1; fdisplay(desc1, “ Display 1“ fdisplay(desc1, “ Display 1“,); ); / /写到文件写到文件file1.out (handle1)file1.out (handle1)和显示器和显示器(1)(1)(stdout)stdout) desc2=handle2|handle1; desc2=handle2|handle1; fdisplay(desc2, “ Display 2“ fdisplay(desc2, “ Display 2“,); ); / /写到文件写到文件file1.out (handle1)file1.out (handle1)和文件和文件file2.(handle2)file2.(handle2) desc3=handle3; desc3=handle3; fdisplay(desc3, “ Display 3“ fdisplay(desc3, “ Display 3“,); ); / /只写到文件只写到文件file3.out (handle1)file3.out (handle1)中中 end end 语法详细讲解语法详细讲解 关闭文件关闭文件 语法要点:语法要点: $fclose ();_handle); 举例:举例: $fclose(handle1); /$fclose(handle1); /关闭关闭file1.out file1.out 语法详细讲解 层次信息的显示层次信息的显示 可以用于任何显示任务如:可以用于任何显示任务如: $display,$write,$monitor,$strobe.$display,$write,$monitor,$strobe. 举例:举例: module M;module M; . . initial $display (“Displaying in %m“); initial $display (“Displaying in %m“); endmodule endmodule module top; module top; M m1( ); / M m1( ); /显示层次信息显示层次信息 M m2( ); M m2( ); M m3( ); . M m3( ); . endmodule endmodule 语法详细讲解 层次信息的显示层次信息的显示 显示任务结果如下:显示任务结果如下: Displaying in top.m1 Displaying in top.m1 Displaying in top.m2 Displaying in top.m2 Displaying in top.m3 Displaying in top.m3 语法详细讲解 用文件中的数据初始化存储器用文件中的数据初始化存储器 语法要点:语法要点: $readmemb( $readmemb(文件名,存储器名文件名,存储器名); ); $readmemb( $readmemb(文件名,文件名, 存储器名,起始地存储器名,起始地 址址); ); $readmemh( $readmemh(文件名,文件名, 存储器名,起始地存储器名,起始地 址址); ); 举例:举例: module test; module test; reg 7:0 memory 0:1023 reg 7:0 memory 0:1023 integer i; integer i; inititial begin $readmemb (“init.dat“,memory); inititial begin $readmemb (“init.dat“,memory); for (i=0;i1024;i=i+1;) for (i=0;i1024;i=i+1;) $display (“memory %0d=%b“, i, $display (“memory %0d=%b“, i, memory);memory); end end endmodule endmodule 语法详细讲解 用文件中的数据初始化存储器用文件中的数据初始化存储器 init.dat init.dat 文件内容:文件内容: 002002 1111_1111 1111_1111 0101_01010101_0101 0000_0000 0000_0000 1010_10101010_1010 008008 Zzzz_1111 Zzzz_1111 0000_11110000_1111 1111_0000 1111_0000 0001_10000001_1000 . memory 0=xxxxxxxxmemory 0=xxxxxxxx memory 1=xxxxxxxxmemory 1=xxxxxxxx memory 2=11111111memory 2=11111111 memory 3=01010101 memory 3=01010101 memory 4=00000000memory 4=00000000 memory 5=10101010memory 5=10101010 memory 6=xxxxxxxxmemory 6=xxxxxxxx memory 7=xxxxxxxxmemory 7=xxxxxxxx memory 8=zzzz1111memory 8=zzzz1111 memory 9=00001111memory 9=00001111 memory 10=11110000memory 10=11110000 memory 11=00011000memory 11=00011000 . 语法详细讲解语法详细讲解 有限状态机(FSM) 隐式FSM: 不需要状态寄存器不需要状态寄存器 仿真更加有效仿真更加有效 只能很好地处理线只能很好地处理线 性的状态改变性的状态改变 大部分综合工具不大部分综合工具不 支持隐式支持隐式FSMFSM state 1state 1 state 2state 2 state 3state 3 state 4state 4 语法详细讲解 有限状态机(FSM) 显式FSM: 结构比较复杂结构比较复杂 可以很方便地用来处理可以很方便地用来处理 默认状态默认状态 能够处理复杂的状态改能够处理复杂的状态改 变变 所有的综合工具均支持所有的综合工具均支持 显式显式FSM FSM 的综合的综合 state A state B1state B1state B2state B2 state Cstate C state Dstate D 注意: 在隐式状态机中,只要发生在一个时钟周期内写数据,在隐式状态机中,只要发生在一个时钟周期内写数据, 在另一个时钟周期内读数据的情况,都会生成寄存器。在另一个时钟周期内读数据的情况,都会生成寄存器。 任何状态机都必须有复位控制信号,状态的改变必需只任何状态机都必须有复位控制信号,状态的改变必需只 与某单一时钟信号沿同步。与某单一时钟信号沿同步。 一般情况下,如果状态改变比较简单,又定义得比较好一般情况下,如果状态改变比较简单,又定义得比较好 ,而且综合工具支持隐式状态机的综合,就可以使用隐,而且综合工具支持隐式状态机的综合,就可以使用隐 式状态机。如果状态改变比较复杂,最好使用显式状态式状态机。如果状态改变比较复杂,最好使用显式状态 机,这样效果更好。机,这样效果更好。 隐式状态机属于行为级,不属于隐式状态机属于行为级,不属于RTLRTL级。代码中主要包级。代码中主要包 含循环语句、嵌入的定时控制,有时也含有命名事件、含循环语句、嵌入的定时控制,有时也含有命名事件、 wait wait 和和 disable disable 语句。一般情况下,常用的综合工具不语句。一般情况下,常用的综合工具不 支持隐式状态机的综合。支持隐式状态机的综合。 语法详细讲解 有限状态机(FSMs) 语法详细讲解 显式有限状态机 module exp(out, datain, clk, rst);module exp(out, datain, clk, rst); input clk, rst, datain;input clk, rst, datain; output out; reg out;output out; reg out; reg state;reg state; always (posedge clk or posedge rst)always (posedge clk or posedge rst) if(rst) state, out=2b00; if(rst) state, out=2b00; else else case(state) case(state) 1b0: begin 1b0: begin out=1b0; out=1b0; if(!datain) state=1b0; if(!datain) state=1b0; else state=1b1; else state=1b1; end end 1b1 begin 1b1 begin 状态变量 case语句 0 1 datain = 0 datain = 1 out=datain; out=datain; state=1b0; state=1b0; end end default: state, out=2b00; default: state, out=2b00; endcase endcase endmoduleendmodule 注:注: 在过程块中可以使用一个时钟沿和在过程块中可以使用一个时钟沿和 case case 语句来描述一个显式语句来描述一个显式 状态机。状态机。 必须指定一个状态变量,来记录状态机的状态。必须指定一个状态变量,来记录状态机的状态。 要改变当前的状态,必须改变状态变量的值,要改变当前的状态,必须改变状态变量的值, 其改变要与时其改变要与时 钟沿同步。钟沿同步。 写得比较好的状态机常为不应产生的条件规定一个默认动作写得比较好的状态机常为不应产生的条件规定一个默认动作 。 语法详细讲解 显式有限状态机 转到下一个状态 默认状态指针 01101 识别11序列 clkrst out begin: seq_block begin: seq_block out=1b0; out=1b0; if(!datain) / if(!datain) /状态一:输出零状态一:输出零 disable seq_block; disable seq_block; (posedge clk) / (posedge clk) /状态二:输出第二位状态二:输出第二位 out=datain; out=datain; end end endmoduleendmodule 语法详细讲解 隐式有限状态机 01101 识别11序列 clkrst out 注意:注意: 在过程块中可以使用多个时钟沿(即每次状态改变都用一个新的时在过程块中可以使用多个时钟沿(即每次状态改变都用一个新的时 钟沿)、条件语句、循环语句、钟沿)、条件语句、循环语句、disabledisable语句来描述隐式语句来描述隐式FSMFSM。隐式。隐式 FSMFSM往往是不可综合的。往往是不可综合的。 隐式隐式FSMFSM不必指定状态变量。不必指定状态变量。 当下一个激活时钟沿到达时,状态就有可能发生改变。下一个状态当下一个激活时钟沿到达时,状态就有可能发生改变。下一个状态 是否改变,将由条件语句决定;除非用强制性语句使状态重复(例是否改变,将由条件语句决定;除非用强制性语句使状态重复(例 如:用循环语句或用如:用循环语句或用disabledisable语句来强制改变状态),语句来强制改变状态), 在隐式状态机中,很难规定一个默认动作。在隐式状态机中,很难规定一个默认动作。 语法详细讲解 隐式有限状态机 目标 学会怎样使用用户定义的原语来创建逻辑。 用户定义的原语元件 (UDP) 其行为与 Verilog 语法 中本来就存在的primitive(原语元件)相似,它用一 个表格来定义它的逻辑功能。 语法详细讲解 用户定义的原语 在在 Verilog Verilog 结构建模时,可以使用:结构建模时,可以使用: 二十多个门级源语元件(二十多个门级源语元件(primitivesprimitives)。)。 用户定义的源语元件(用户定义的源语元件(UDPUDP)。)。 UDP UDP 可用于可用于ASIC ASIC 库中的基本元件(库中的基本元件(cellcell)设计,以及小规)设计,以及小规 模芯片和中规模芯片的设计。模芯片和中规模芯片的设计。 使用使用 UDP UDP可以在现有的可以在现有的Verilog Verilog 语言支持的源语元件的语言支持的源语元件的 基础上编写新的源语元件。基础上编写新的源语元件。 UDP UDP 是一个独立元件,是一个独立元件, 不能用实例调用的方法调用其不能用实例调用的方法调用其 他的模块。他的模块。 UDP UDP 既可以用来表示时序逻辑元件,也可以表示组合逻既可以用来表示时序逻辑元件,也可以表示组合逻 辑元件。辑元件。 UDP UDP 的行为是使用真值表来描述的的行为是使用真值表来描述的 。 调用调用 UDP UDP 的方式与调用的方式与调用VerilogVerilog语言提供的源语元件的语言提供的源语元件的 方式相同。方式相同。 语法详细讲解 什么是UDP? 注意:注意: UDP UDP 是一种紧凑的表示简单逻辑关系部件的方是一种紧凑的表示简单逻辑关系部件的方 法。法。 在在VerilogVerilog语言提供的几种基本源语元件中,若语言提供的几种基本源语元件中,若 在输入中包含不确定值在输入中包含不确定值x x,则在输出时可能出现,则在输出时可能出现 不确定值不确定值 x x;而在;而在 UDP UDP 中则不允许出现此种情中则不允许出现此种情 况。况。 由几个原语元件组成的逻辑可以用一个由几个原语元件组成的逻辑可以用一个UDPUDP表表 示。在仿真时使用这样的示。在仿真时使用这样的UDPUDP来代替分散的原来代替分散的原 语元件可以节省计算资源,加快仿真速度。一语元件可以节省计算资源,加快仿真速度。一 般的仿真器处理行为模型表示的逻辑所需时间般的仿真器处理行为模型表示的逻辑所需时间 比处理用门级语句表示的相同逻辑所需时间少比处理用门级语句表示的相同逻辑所需时间少 ;而硬件仿真器正好相反。;而硬件仿真器正好相反。 语法详细讲解 什么是UDP? UDP UDP 只能有一个输出端,而且必须是端口说明只能有一个输出端,而且必须是端口说明 列表的第一项。列表的第一项。 UDP UDP 可以有多个输入端,最多允许有可以有多个输入端,最多允许有 10 10 个。个。 UDP UDP 所有端口变量必须是标量,不允许使用双所有端口变量必须是标量,不允许使用双 向端口。向端口。 UDP UDP 不支持不支持Z Z(高阻)逻辑值。(高阻)逻辑值。 在仿真的开始时刻,可以使用在仿真的开始时刻,可以使用 initial initial 语句把语句把 UDP UDP 的输出初始化为一个已知值。的输出初始化为一个已知值。 UDP UDP 不支持综合,即不能通过综合把它转变为不支持综合,即不能通过综合把它转变为 门级结构逻辑。门级结构逻辑。 语法详细讲解 UDP的特点 注:注: UDP UDP 只能有一个输出。如果逻辑功能要求有多只能有一个输出。如果逻辑功能要求有多 个输出端时,则需要把其它的原语元件连接到个输出端时,则需要把其它的原语元件连接到 UDPUDP的的 输出,或同时使用多个输出,或同时使用多个 UDP UDP,保证其最,保证其最 终输出只有一个。终输出只有一个。 UDP UDP 输入端最多可以有输入端最多可以有 10 10 个,但是当输入端个,但是当输入端 的个数多于的个数多于 5 5 个时,仿真时需要的内存个数个时,仿真时需要的内存个数 将呈现近似指数的增加。下表列出了当输入数将呈现近似指数的增加。下表列出了当输入数 目不同时,在仿真过程中,对每个输入信号,目不同时,在仿真过程中,对每个输入信号, 计算机中所需要开销的内存数目。计算机中所需要开销的内存数目。 语法详细讲解 UDP的特点 语法详细讲解 UDP的特点 输输入端口的个数所需内存的字节节数 1-51 65 717 856 9187 10623 组合逻辑示例:2-1 多路器 语法详细讲解 举例说明 primitive multiplexer(o, a, b, s);primitive multiplexer(o, a, b, s); output o; output o; input s, a, b; input s, a, b; table table / a b s : o / a b s : o 0 ? 1 : 0; 0 ? 1 : 0; 1 ? 1 : 1; 1 ? 1 : 1; ? 0 0 : 0; ? 0 0 : 0; ? 1 0 : 1; ? 1 0 : 1; 0 0 x : 0; 0 0 x : 0; 1 1 x : 1; 1 1 x : 1; endtable endtable endprimitiveendprimitive 原语名 输出端口必须为 第一个端口 注: 在模块外定义在模块外定义 UDP UDP 。 如果在表中没有规定输入组合,将输出不确定逻辑值如果在表中没有规定输入组合,将输出不确定逻辑值 (x) (x)。 表的列中元素的顺序应与端口列表中的一致。表的列中元素的顺序应与端口列表中的一致。 表中的表中的 ?的意义是:重复的输入?的意义是:重复的输入 0 0,1 1或或 任意不确定逻辑值任意不确定逻辑值(x)(x)。 表中开始两行表示:当表中开始两行表示:当 s s等于等于 1 1 时,不管时,不管 b b 逻辑值如何变化,输出逻辑值如何变化,输出 o o 将将 与与 输入输入 a a 保持一致。保持一致。 表中的下两行表示:当表中的下两行表示:当 s s 等于等于 0 0 时,不管时,不管 a a逻辑值如何变化,输出逻辑值如何变化,输出 o o 将将 与输入与输入 b b 保持一致。保持一致。 表中表中 的最后两行使此器件的描述更加的全面、准确。它们表示:当输的最后两行使此器件的描述更加的全面、准确。它们表示:当输 入入 a a 和和 b b 的逻辑值相同时,如果的逻辑值相同时,如果 sel sel 逻辑值不确定,则输出逻辑值不确定,则输出 o o 的值的值 将将 与输入与输入 a a 和和 b b 的值相同。这种行为不能使用的值相同。这种行为不能使用 Verilog Verilog 语言提供的基本原语言提供的基本原 语元件进行建模。语元件进行建模。UDP UDP 将将 x x 作为实际的未知值,而不是作为实际的未知值,而不是 Verilog Verilog 语言语言 逻辑值来进行处理,因此使其比逻辑值来进行处理,因此使其比VerilogVerilog语言提供的基本原语元件更加语言提供的基本原语元件更加 准确。准确。 语法详细讲解 举例说明 可以只使用两个可以只使用两个 UDP UDP 来描述全加器的逻辑功能。来描述全加器的逻辑功能。 / / 全加器进位实现部分全加器进位实现部分 primitive U_ADDR2_C (CO, A, B, CI);primitive U_ADDR2_C (CO, A, B, CI); output CO; output CO; input A, B, CI, input A, B, CI, table / A B CI : CO table / A B CI : CO 1 1 ? : 1; 1 1 ? : 1; 1 ? 1 : 1; 1 ? 1 : 1; ? 1 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 0 ? : 0; 0 ? 0 : 0; 0 ? 0 : 0; ? 0 0 : 0; ? 0 0 : 0; endtalbe endtalbe endprimitiveendprimitive 语法详细讲解 组合逻辑示例:全加器 向上一级进位 下一级来的进位 / /全加器求和实现部分全加器求和实现部分 primitive U_ADDR2_S(S, A, B,CI);primitive U_ADDR2_S(S, A, B,CI); output S; output S; input A, B, CI; input A, B, CI; table / A B CI : S table / A B CI : S 0 0 0 : 0; 0 0 0 : 0; 0 0 1 : 1; 0 0 1 : 1; 0 1 0 : 1; 0 1 0 : 1; 0 1 1 : 0; 0 1 1 : 0; 1 0 0 : 1; 1 0 0 : 1; 1 0 1 : 0; 1 0 1 : 0; 1 1 0 : 0; 1 1 0 : 0; 1 1 1 : 1; 1 1 1 : 1; endtable endtable endprimitiveendprimitive 语法详细讲解 组合逻辑示例:全加器 若使用若使用 UDP UDP 设计全加器,仅需要两个设计全加器,仅需要两个 UDP UDP; 而使用而使用 Verilog Verilog 原语元件,则需要原语元件,则需要 5 5 个个VerilogVerilog语言提供的基本原语元件。语言提供的基本原语元件。 当设计需要使用大量全加器时,采用当设计需要使用大量全加器时,采用UDPUDP来表示全加器,将来表示全加器,将 大大减少内存的需要。大大减少内存的需要。 事件的数目将大大降低。事件的数目将大大降低。 ?表示逻辑值可以为?表示逻辑值可以为 0 0,1 1或或 x x。 语法详细讲解 组合逻辑示例:全加器 primitive latch(q, clock, data);primitive latch(q, clock, data); output q; output q; reg q; reg q; input clock, data; input clock, data; initial q=1b1; initial q=1b1; table table / clock data current next / clock data current next / state state / state state 0 1 : ? 1; 0 1 : ? 1; 0 0 : ? 0; 0 0 : ? 0; 1 ? : : -; 1 ? : : -; endtable endtable endprimitiveendprimitive 语法详细讲解 电平敏感的时序逻辑示例:锁存器 注意此寄存器的用法, 此寄存器用来存储。 输出初始化为 1b1. ? 表示无须考虑输入 和当前状态的值 注:注: 锁存器的动作行为如下:锁存器的动作行为如下: 当时钟信号为当时钟信号为 0 0时,输入数据的值直接传给输出。时,输入数据的值直接传给输出。 当时钟信号为当时钟信号为1 1时,输出保持当前状态不变。时,输出保持当前状态不变。 next state next state 栏中的栏中的 “-” “-” 表示输出保持不变。表示输出保持不变。 输出必须定义为寄存器类型,用来保存前一个状态。输出必须定义为寄存器类型,用来保存前一个状态。 initial q=1b1; initial q=1b1; 是时序是时序 UDP UDP 的初始化语句。使用此语句可以的初始化语句。使用此语句可以 在仿真的开始对输出进行赋值。在仿真的开始对输出进行赋值。 在实际的部件模型中,很少使用初始赋值。但在测试在实际的部件模型中,很少使用初始赋值。但在测试 UDP UDP 的的 功能时,初始赋值相当有用。功能时,初始赋值相当有用。 语法详细讲解 电平敏感的时序逻辑示例:锁存器 primitive d_edge_ff (q, clk, data);primitive d_edge_ff (q, clk, data); output q;output q; input clk, data;input clk, data; reg q;reg q; table / clk dat state nexttable / clk dat state next (01) 0 : ? : 0; (01) 0 : ? : 0; (01) 1 : ? : 1; (01) 1 : ? : 1; (0x) 1 : 1 : 1; (0x) 1 : 1 : 1; (0x) 0 : 0 : 0; (0x) 0 : 0 : 0; (x1) 0 : 0 : 0; (x1) 0 : 0 : 0; (x1) 1 : 1 : 1; (x1) 1 : 1 : 1; 语法详细讲解 跳边沿敏感的时序逻辑示例:D 触发器 / / 忽略时钟的下降沿忽略时钟的下降沿 (?0) ? : ? : -; (?0) ? : ? : -; (1x) ? : ? : -; (1x) ? : ? : -; / / 忽略时钟稳定时的数据改变忽略时钟稳定时的数据改变 endtable endtable endprimitiveendprimitive 在大多数情况下,可以在任何表入口语句中规定一个输入过在大多数情况下,可以在任何表入口语句中规定一个输入过 渡。渡。 如果规定了任何输入过渡,则必须规定所有输入的所有过渡如果规定了任何输入过渡,则必须规定所有输入的所有过渡 。 语法详细讲解 跳边沿敏感的时序逻辑示例:D 触发器 建立时间和保持时间的概念: 语法详细讲解 $setup $setup 和和 $hold $hold 时间的概念时间的概念 clock holdup time data setup time 3 3 5 5 /setup check is set /clock is the reference /data is being checked for violation /violation reported if Tposedge_clk -Tdata3 specify $setup (data, posedge clock, 3); endspecify 语法详细讲解 检查建立时间的系统任务:检查建立时间的系统任务:$setup $setup /Hold check is set /clock is the reference /data is being checked for violation /violation reported if Tdata -Tposedge_clk 5 specify $hold ( posedge clock, data, 5); endspecify 语法详细讲解 检查保持时间的系统任务检查保持时间的系统任务 $hold $hold /Hold check is set /posedge of clear is the reference /the next negedge of clear is the data_event /violation reported if Tposedge_clk - Tnegedge_clk 6 specify $width ( posedge clear, 6); endspecify 语法详细讲解 脉冲宽度检查脉冲宽度检查 $width $width clear 脉冲宽度脉冲宽度 6ns6ns 可综合建模类型只有两种可综合建模类型只有两种: : 44组合逻辑组合逻辑: : 任何时候,如果输出信号直接由当前的输任何时候,如果输出信号直接由当前的输 入信号的组合决定,则此逻辑为组合逻辑入信号的组合决定,则此逻辑为组合逻辑 。 44时序逻辑:时序逻辑: 如果逻辑中具有记忆功能,则此逻辑为时如果逻辑中具有记忆功能,则此逻辑为时 序逻辑。在任何给定的时刻,如果输出不序逻辑。在任何给定的时刻,如果输出不 能完全由输入信号确定,则此逻辑具有记能完全由输入信号确定,则此逻辑具有记 忆功能。忆功能。 语法详细讲解 可综合风格的Verilog建模类型 综合工具不支持下面的综合工具不支持下面的 Verilog Verilog 结构:结构: 44 initial initial 44 循环语句:循环语句: 44 repeat repeat 44 forever forever 44 while while 44 for for 的非结构用法的非结构用法 44 一部分数据类型一部分数据类型 44 event event 44 real real 44 time time 语法详细讲解 不能综合的 Verilog结构 44 UDPs UDPs 44 forkjoin forkjoin 块块 44 wait wait 44 过程连续赋值语句过程连续赋值语句 44 assign assign 和和 deassign deassign 44 force force 和和 release release 44 部分操作符部分操作符 44 = = = = = = 44 != = = 语法详细讲解 不能综合的不能综合的 Verilog Verilog 结构结构 由输入信号中任意一个电平发生变化所引起的过程由输入信号中任意一个电平发生变化所引起的过程 块:块: 由输入信号中的某一个电平发生变化启动的过程块,可以通由输入信号中的某一个电平发生变化启动的过程块,可以通 过综合产生组合逻辑。该过程块称为组合块。如下例所示:过综合产生组合逻辑。该过程块称为组合块。如下例所示: always (a or b) / always (a or b) / 实现与门实现与门 y=a y=a 由单个跳变沿引起的过程块:由单个跳变沿引起的过程块: 由控制信号的跳变沿(下降沿或上升沿)启动的过程块通过由控制信号的跳变沿(下降沿或上升沿)启动的过程块通过 综合可以生成同步逻辑。该过程块称为同步块。如下例所示综合可以生成同步逻辑。该过程块称为同步块。如下例所示 : always (posedge clk) / always (posedge clk) /实现实现 D D 触发器触发器 q=d; q=d; 语法详细讲解 可综合的过程块 在同步块中可以添加异步复位,举例说在同步块中可以添加异步复位,举例说明如下 : always (posedge clk or negedge rst_) always (posedge clk or negedge rst_) if(!rst_) if(!rst_) q=0; q=0; else else q=d; q=d; 语法详细讲解 过程块 在同步块中使用在同步块中使用 reg reg 类型变量:类型变量: 如果在一个时钟沿对如果在一个时钟沿对regreg变量赋值,而在下一个时钟沿对其采变量赋值,而在下一个时钟沿对其采 样,则综合器把该样,则综合器把该regreg变量转换为硬件寄存器。变量转换为硬件寄存器。 如果只把如果只把regreg变量作为基本输出,则综合器不一定把它转换为变量作为基本输出,则综合器不一定把它转换为 硬件寄存器。硬件寄存器。 如果不属于上述两种情况,同步块中的如果不属于上述两种情况,同步块中的regreg变量有可能被优化变量有可能被优化 掉。掉。 在组合块中使用在组合块中使用 reg reg 类型变量:类型变量: 当组合块中任何一个输入变量的值改变时,当组合块中任何一个输入变量的值改变时,regreg变量的值也随变量的值也随 之改变,则综合器不会把该之改变,则综合器不会把该regreg变量转换为硬件寄存器。变量转换为硬件寄存器。 当块的某一个输入的值改变时,当块的某一个输入的值改变时,regreg变量的值不一定立即改变变量的值不一定立即改变 ,而要等其他输入信号的值改变时才改变,则综合器将把该,而要等其他输入信号的值改变时才改变,则综合器将把该 regreg变量转换为锁存器。变量转换为锁存器。 语法详细讲解 过程块中寄存器类型的信号变量 同步寄存器示例: 在下面的例子中,rega 仅用作临时存储器,因此在综合时它将被优化掉 。 module ex1reg(d, clk, q); input d, clk; output q; reg q, rega; always (posedge clk) begin rega = 0; if(d) rega = 1; q = rega; end endmodule 语法详细讲解 寄存器 在下面的例子中,用两个always块,它们的触发条件是相同的: 即 用同一时钟沿来处理两个存储元素,这样就可以使综合器在综合 过 程中保留rega,使它不被优化掉。 module ex2reg(d, clk, q);module ex2reg(d, clk, q); input d, clk;input d, clk; output q;output q; reg q, rega;reg q, rega; always (posedge clk) always (posedge clk) begin begin rega=0; rega=0; if(d) rega=1; if(d) rega=1; end end 语法详细讲解 寄存器 always (posedge clk)always (posedge clk) q = rega; q = rega; endmoduleendmodule 注:在后面的注:在后面的alwaysalways块中,块执行的顺序是不确定的,因此块中,块执行的顺序是不确定的,因此 q q 可可 以获得在前一个周期中赋给以获得在前一个周期中赋给 rega rega 的值。的值。 语法详细讲解 寄存器 组合寄存器示例: 下面的两个例子中,下面的两个例子中,rega rega 都是临时变量,都是临时变量, 在在 综合中它们都会被优化掉。在本例中,综合中它们都会被优化掉。在本例中,y y 和和rega rega 不断被赋新值(不断被赋新值( 因因 为语句中有为语句中有else rega = 0;else rega = 0;),综合出的电路是一个纯组合逻辑。),综合出的电路是一个纯组合逻辑。 module ex3reg(y, a, b, c);module ex3reg(y, a, b, c); input a, b, c;input a, b, c; output y;output y; reg y, rega;reg y, rega; always (a or b always (a or b or c) or c) begin begin 语法详细讲解 寄存器 if(a rega=c; else else rega=0; rega=0; y=rega; y=rega; end end endmoduleendmodule 在下面的例子中,在下面的例子中,rega rega 只是有时被赋新值只是有时被赋新值 ( (没有没有else else 语句,语句, regarega在条在条 件不符合时保持原值件不符合时保持原值) );因此综合出来的是一个以;因此综合出来的是一个以 y y 作为输出的锁存器。作为输出的锁存器。 语法详细讲解 寄存器 moudule ex4reg(y, a, b, c);moudule ex4reg(y, a, b, c); input a, b, c;input a, b, c; output y;output y; reg y, rega;reg y, re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论