Verilog-语言教程(逻辑及语法部分)_第1页
Verilog-语言教程(逻辑及语法部分)_第2页
Verilog-语言教程(逻辑及语法部分)_第3页
Verilog-语言教程(逻辑及语法部分)_第4页
Verilog-语言教程(逻辑及语法部分)_第5页
已阅读5页,还剩210页未读 继续免费阅读

下载本文档

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

文档简介

Verilog语言教程

逻辑及语法2021/7/131Verilog语言教程

逻辑及语法2021/7/131数字系统设计的核心知识

复杂数字系统的构成;基本电路和Verilog的对应关系;同步有限状态机在电路中的作用;时钟树与自动综合技术2021/7/132数字系统设计的核心知识

复杂数字系统的构成;2021/7/数字逻辑电路的构成

-组合逻辑:输出只是输入逻辑电平的函数(有延时),与电路的原始状态无关。时序逻辑:输出不只是输入的逻辑电平的函数,还与电路所处的状态有关。同步时序逻辑是在同一时钟跳变节拍的前提下,如输入条件满足,则进入下一状态,否则仍留在原来的状态的状态机。2021/7/133数字逻辑电路的构成

-组合逻辑:输出只是输入逻辑电平的函数字逻辑电路的构成组合逻辑:由与、或、非门组成的网络。常用的有:多路器、数据通路开关、加法器、乘法器等,没有记忆功能。时序逻辑:

由多个触发器和多个组合逻辑块组成的网络。常用的有:计数器、复杂的数据流动控制逻辑、运算控制逻辑、指令分析和操作控制逻辑。同步时序逻辑的设计是设计复杂的数字逻辑系统的核心。存储器和寄存器:用于暂时存储数据信息。2021/7/134数字逻辑电路的构成组合逻辑:由与、或、非门组成的网络。常用的组合逻辑举例之一

一个八位数据通路控制器`defineON1‘b1`defineOFF1‘b0wireControlSwitch;wire[7:0]out,in;assignout=(ControlSwith==`ON)?in:8‘h00in[7]ControlSwitchout[7]in[0]out[0]…...…...2021/7/135组合逻辑举例之一

一个八位数据通路控制器`define一个八位数据通路控制器的波形:

in[7:0]开关out[7:0]tt31

0215

3262

88

0215

320000in[7]ControlSwitchout[7]in[0]out[0]…...…...2021/7/136一个八位数据通路控制器的波形:

in[7:0]开关out[带寄存器的八位数据通路控制器的波形in[7]ControlSwitchout[7]CLOCKDQ[7]CLOCKin[0]ControlSwitchout[0]DQ[0]out[7]out[0]2021/7/137带寄存器的八位数据通路控制器的波形in[7]ControlS带寄存器的八位数据通路控制器的Verilog描述`defineON1‘b1`defineOFF1‘b0wireControlSwitch;wireclockwire[7:0]out,in;always@(posedgeclock)if(ControlSwith==`ON)out<=in;elseout<=out;2021/7/138带寄存器的八位数据通路控制器的Verilog描述`defin带复位端和使能端的寄存器

moduleregena(clock,ena,reset,R,Q);parametern=8;input[n-1:0]R;inputclock,enareset;output[n-1:0]Q;always@(posedgeclockornegedgereset)if(!reset)Q<=0;elseif(ena)Q<=R;endmoduleenaRclockDQQreset2021/7/139带复位端和使能端的寄存器moduleregena(cl具有并行置数和使能控制输入的移位寄存器R1enawclockDQQresetQ1DQQ0R0load2021/7/1310具有并行置数和使能控制输入的移位寄存器R1enawclock具有并行置数和使能控制输入的移位寄存器moduleshiftregs(R,load,ena,w,clock,Q,reset);input[3:0]R;inputw,load,ena,reset,clock;output[3:0]Q;reg[3:0]Q;integerk;always@(posedgeclockornegedgereset)if(!reset)Q<=0;elseif(load)Q<=R;elseif(ena)beginQ[0]<=W;for(k=1;k<4;k+1)Q[k]<=Q[k-1];endendmodule2021/7/1311具有并行置数和使能控制输入的移位寄存器moduleshif组合逻辑举例之二:

一个八位三态数据通路控制器`defineON1‘b1`defineOFF1‘b0wireLinkBusSwitch;wire[7:0]outbuf;inout[7:0]bus;assignbus=(LinkBusSwitch==`ON)?outbuf:8‘hzz…...…...outbuf[7]LinkBusSwitchbus[7]2021/7/1312组合逻辑举例之二:

一个八位三态数据通路控制器`define八位三态数据通路控制器的波形:

outbuf[7:0]开bus[7:0]tt31

0215

3262

88

0215

32ZZZZLinkBusSwitch关outbuf[7]LinkBusSwitchbus[7]2021/7/1313八位三态数据通路控制器的波形:

outbuf[7:0]开b静态随机存储器(SRAM)

Sel信号必须维持一定时间,直到经过两个反向器传递过来的Data信号可以自动保持;

Data的驱动能力必须大于小反向器的驱动能力;用的三极管很少,可以把密度做得很高。SelData2021/7/1314静态随机存储器(SRAM)Sel信号必须维持一定时间静态随机存储器(SRAM)阵列Sel0Data[0]Sel1Data[1]2021/7/1315静态随机存储器(SRAM)阵列Sel0Data[0]Sel1地址译码和SRAM块的读写DataoutputAddressAm-1A1A0Am-2writereadDatainputsel0sel1Sel2m-2Sel2m-1地址译码器2021/7/1316地址译码和SRAM块的读写DataoutputAddre开关逻辑应用举例

寄存器间数据流动的控制开关qdqdqdqdqdqdqdqdqdqdqdqdclock开关S1

开关S2组合逻辑组合逻辑寄存器1寄存器2寄存器32021/7/1317开关逻辑应用举例

寄存器间数据流动的控制开关qdqdqdqd开关逻辑应用举例

寄存器间数据流动的控制开关clock开关S5

寄存器Cqd开关S6开关S3

寄存器Bqd开关S4开关S1

寄存器Aqd开关S22021/7/1318开关逻辑应用举例

寄存器间数据流动的控制开关clock开关S开关逻辑的时延问题

控制数据运算和流动的开关的开启和关闭时序.

组合逻辑输出控制开关Sn

in[7:0]out[15:0]in[7:0]

8‘d31

8‘d202

16‘d93

16‘d606延时10nsSn开关out[15:0]ttt2021/7/1319开关逻辑的时延问题

控制数据运算和流动的开关的开启和关闭时序全局时钟网和平衡树结构全局时钟网络触发器缓冲器

触发器1触发器n图1全局时钟网示意图

图2平衡树结构示意图2021/7/1320全局时钟网和平衡树结构全局时钟网络触发器缓冲器触发器1触避免冒险和竞争由于组合逻辑和布线的延迟引起abttcclockabc2021/7/1321避免冒险和竞争由于组合逻辑和布线的延迟引起abttccloc避免冒险和竞争与流水线组合逻辑和布线的延迟在组合逻辑中的叠加ba#2#3#4cedba#2#3#4ced总延迟=Max{2,3}+4=7时钟周期必须>7ns总延迟={Max{2,3}+4+1}=8时钟周期必须>4ns总处理数据的吞吐量增加#1#1clock2021/7/1322避免冒险和竞争与流水线组合逻辑和布线的延迟在组合逻辑中的叠加为什么要设计有限状态机?

如果能严格以时钟跳变沿为前提,按排好时时序,来操作逻辑系统中每一个开关Si,则系统中数据的流动和处理会按同一时钟节拍有序地进行,可以控制冒险和竞争现象对逻辑运算的破坏,时延问题就能有效地加以解决。利用同步有限状态机就能产生复杂的以时钟跳变沿为前提的同步时序逻辑,并提供操作逻辑系统的开关阵列所需要的复杂控制时序(具有信号互锁和先后次序等要求的)。2021/7/1323为什么要设计有限状态机?

如果能严格以时钟跳变沿为前提为什么要设计有限状态机?如果我们能设计这样一个电路:1)能记住自己目前所处的状态;2)状态的变化只可能在同一个时钟的跳变沿时刻发生,而不可能发生在任意时刻;3)在时钟跳变沿时刻,如输入条件满足,则进入下一状态,并记住自己目前所处的状态,否则仍保留原来的状态;4)在进入不同的状态时刻,对系统的开关阵列做开启或关闭的操作。2021/7/1324为什么要设计有限状态机?如果我们能设计这样一个电路:2021为什么要设计有限状态机?clock10nsS2开关S1tttSnS3tttS42021/7/1325为什么要设计有限状态机?clock10nsS2开关S1为什么要设计有限状态机?

有了以上电路,我们就不难设计出复杂的控制序列来操纵数字系统的控制开关阵列。能达到以上要求的电路就是时序和组合电路互相结合的产物:同步有限状态机和由状态和时钟共同控制的开关逻辑阵列。我们只要掌握有限状态机的基本设计方法,加上对基本电路的掌握,再加上对数据处理的过程的细致了解,我们就可以避免由于逻辑器件和布线延迟产生的冒险竞争现象所造成的破坏,设计出符合要求的复杂数字逻辑系统。2021/7/1326为什么要设计有限状态机?有了以上电路,我们就不难设计出数字系统的构成示意图同步有限状态机ena_2ena_3ena_nena_1clock组合逻辑

1寄存器组组合逻辑

2寄存器组组合逻辑

3寄存器组组合逻辑

N寄存器组input_1input_2input_n2021/7/1327数字系统的构成示意图ena_2ena_3ena_nena_1同步有限状态机的设计什么是有限状态机(FSM)FSM的种类和不同点设计举例2021/7/1328同步有限状态机的设计什么是有限状态机(FSM)2021/什么是有限状态机?

-有限状态机是由寄存器组和组合逻辑构成的硬件时序电路;-其状态(即由寄存器组的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态;-究竟转向哪一状态不但取决于各个输入值,还取决于当前状态。-状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑,是数字逻辑的控制核心。2021/7/1329什么是有限状态机?

2021/7/1329Mealy状态机

下一个状态=F(当前状态,输入信号);

输出信号=G(当前状态,输入信号);

图1.时钟同步的状态机结构(Mealy状态机)下一状态的逻辑F输出逻辑

G状态寄存器时钟信号clkclk输入输入输出当前状态激励信号2021/7/1330Mealy状态机

下一个状态=F(当前状态,输入信号

Moor状态机

下一个状态=F(当前状态,输入信号)

输出信号=G(当前状态);

下一状态的逻辑F输出逻辑

G状态寄存器时钟信号clkclk输入输入输出当前状态激励信号图2.时钟同步的状态机结构(Moor状态机)2021/7/1331

Moor状态机

下一个状态=F(当前状态,输入信号

带流水线输出的Mealy状态机

下一个状态=F(当前状态,输入信号);

输出信号=G(当前状态,输入信号);

输出图3带流水线输出的Mealy状态机下一状态的逻辑F输出逻辑

G状态寄存器时钟信号clkclk输入输入当前状态激励信号输出流水线寄存器

clk输入2021/7/1332

带流水线输出的Mealy状态机

下一个状态=简单的状态机设计举例状态转移图表示RTL级可综合的Verilog模块表示2021/7/1333简单的状态机设计举例状态转移图表示2021/7/1333有限状态机的图形表示图形表示:状态、转移、条件和逻辑开关图3.4状态转移图Idle

Start

StopClear

A/K1=0

!AA/K2=1

!Reset/K2=0K1=0!Reset/K2=0K1=0

(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=02021/7/1334有限状态机的图形表示图形表示:状态、转移、条件和逻辑开关图3有限状态机的Verilog描述定义模块名和输入输出端口;定义输入、输出变量或寄存器;定义时钟和复位信号;定义状态变量和状态寄存器;用时钟沿触发的always块表示状态转移过程;在复位信号有效时给状态寄存器赋初始值;描述状态的转换过程:符合条件,从一个状态到另外一个状态,否则留在原状态;验证状态转移的正确性,必须完整和全面。2021/7/1335有限状态机的Verilog描述定义模块名和输入输出端口;20表示方法之一modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;//定义时钟、复位和输入信号outputK2,K1;//定义输出控制信号的端口regK2,K1;//定义输出控制信号的寄存器reg[1:0]state;

//定义状态寄存器parameterIdle=2’b00,Start=2’b01,Stop=2’b10,Clear=2’b11;//定义状态变量参数值

always@(posedgeClock)if(!Reset)begin//定义复位后的初始状态和输出值

state<=Idle;K2<=0;K1<=0;end2021/7/1336表示方法之一modulefsm(Clock,Rese表示方法之一(续)elsecase(state)Idle:beginif(A)beginstate<=Start;K1<=0;endelsestate<=Idle;endStart:beginif(!A)state<=Stop;elsestate<=Start;end2021/7/1337表示方法之一(续)else2021/7/1337表示方法之一(续)

Stop:begin//符合条件进入新状态,否则留在原状态

if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;endClear:beginif(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;endendcaseendmodule

2021/7/1338表示方法之一(续)Stop:begin//符表示方法之二我们还可以用另一个VerilogHDL模型来表示同一个有限状态,见下例。(用可综合的Verilog模块设计用独热码表示状态的状态机)

modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[3:0]state;

parameterIdle=4’b1000,Start=4’b0100,Stop=4’b0010,Clear=4’b0001;

2021/7/1339表示方法之二我们还可以用另一个VerilogHDL模型来表示方法之二(续)always@(posedgeclock)if(!Reset)beginstate<=Idle;K2<=0;K1<=0;endelsecase(state)Idle:if(A)beginstate<=Start;K1<=0;endelsestate<=Idle;

2021/7/1340表示方法之二(续)always@(posedgeclo表示方法之二(续)

Start:if(!A)state<=Stop;elsestate<=Start;Stop:if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;Clear:if(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;2021/7/1341表示方法之二(续)Start:if(!A)表示方法之二(续)

default:state<=Idle;endcaseendmodule

[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。

2021/7/1342表示方法之二(续)default:s表示方法之三

在比较复杂的状态机设计过程中,我们往往把状态的变化与输出开关的控制分成两部分来考虑。就象前面讲过的Mealy状态机输出部分的组合逻辑。为了调试方便,还常常把每一个输出开关写成一个个独立的always组合块。在调试多输出状态机时,这样做比较容易发现问题和改正模块编写中出现的问题。建议同学们在设计复杂的多输出状态机时采用下面的风格举例,说明如下:

2021/7/1343表示方法之三在比较复杂的状态机设计过程中,我们往往把表示方法之三(续)modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state,nextstate;

parameterIdle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;2021/7/1344表示方法之三(续)modulefsm(Clock,R表示方法之三(续)

//--------每一个时钟沿产生一次可能的状态变化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end//-------------------------------------------------------2021/7/1345表示方法之三(续)//--------每一个时钟沿产生一表示方法之三(续)//------产生下一状态的组合逻辑-------------------------

always@(stateorA)case(state)Idle:if(A)nextstate=Start;elsenextstate=Idle;Start:if(!A)nextstate=Stop;elsenextstate=Start;Stop:if(A)nextstate=Clear;elsenextstate=Stop;Clear:if(!A)nextstate=Idle;elsenextstate=Clear;default:nextstate=2'bxx;endcase2021/7/1346表示方法之三(续)//------产生下一状态的组合逻辑表示方法之三(续)//----产生输出K1的组合逻辑--------------always@(stateorResetorA)if(!Reset)K1=0;elseif(state==Clear&&!A)//从Clear转向IdleK1=1;elseK1=0;

//---产生输出K2的组合逻辑---------------always@(stateorResetorA)if(!Reset)K2=0;elseif(state==Stop&&A)//从Stop转向ClearK2=1; elseK2=0;//------------------------------------------endmodule

2021/7/1347表示方法之三(续)//----产生输出K1的组合逻辑--表示方法之四

用输出指定的码表示状态的状态机

方法四采用了另一种方法:直接把状态码定义为输出。也就是把状态码的指定与状态机控制的输出联系起来,把状态的变化直接用作输出,这样做可以提高输出信号的开关速度并节省电路器件。这种设计方法常用在高速状态机中。建议同学们在设计高速状态机时采用方法四的风格。例中state[3]和state[0]分别表示前面两个例子中的输出K2和K1。2021/7/1348表示方法之四

用输出指定的码表示状态的状态机方法四采用了表示方法之四(续)modulefsm(Clock,Reset,A,K2,K1,state);inputClock,Reset,A;outputK2,K1;output[4:0]state;reg[4:0]state;

assignK2=state[4];//把状态变量的最高位用作输出K2assignK1=state[0];//把状态变量的最低位用作输出K12021/7/1349表示方法之四(续)modulefsm(Clock,R表示方法之四(续)parameter//-------outputcodedstateassignment---//--------K2_i_j_n_K1–Idle=5'b0_0_0_0_0,Start=5'b0_0_0_1_0,Stop=5'b0_0_1_0_0,StopToClear=5'b1_1_0_0_0,Clear=5'b0_1_0_1_0,ClearToIdle=5'b0_0_1_1_1;

2021/7/1350表示方法之四(续)parameter2021/7/1350表示方法之四(续)

always@(posedgeClock)if(!Reset)beginstate<=Idle;endelsecase(state)Idle:if(A)state<=Start;elsestate<=Idle;

Start:if(!A)state<=Stop;elsestate<=Start;

2021/7/1351表示方法之四(续)always@(posedgeClo表示方法之四(续)Stop:if(A)state<=StopToClear;elsestate<=Stop;StopToClear:state<=Clear;Clear:if(!A)state<=ClearToIdle;elsestate<=Clear;

ClearToIdle:state<=Idle;

default:state<=Idle;endcaseendmodule2021/7/1352表示方法之四(续)Stop:if(A)2021/状态机的测试

不同风格的描述适合不同规模的状态机和不同的综合工具,有的风格查错和修改较容易,但写简单的状态机时比较麻烦。Synopsys公司的综合器建议使用这种风格来描述状态机。

上面四个例子是同一个状态机的四种不同的VerilogHDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。下面列出测试这些不同风格状态机的测试模块,供同学们参考:

2021/7/1353状态机的测试不同风格的描述适合不同规模的状态机和不同

状态机的测试模块`timescale1ns/1nsmodulet;rega;regclock,rst;wirek2,k1;initial//initial常用于仿真时信号的给出。

begina=0;rst=1;//给复位信号变量赋初始值

clock=0;//给时钟变量赋初始值

#22rst=0;//使复位信号有效

#133rst=1;//经过一个多周期后使复位信号无效

end

2021/7/1354状态机的测试模块`timescale1ns/1ns202

状态机的测试模块

always#50clock=~clock;//产生周期性的时钟

always@(posedgeclock)//在每次时钟正跳变沿时刻产生不同的abegin#30a={$random}%2;//每次a是0还是1是随机的。

#(3*50+12);//a的值维持一段时间

endinitialbegin#100000$stop;end//系统任务,暂停仿真以便观察仿真波形。

//-----------调用被测试模块t.m----------fsmm(.Clock(clock),.Reset(rst),.A(a),.K2(k2),.K1(k1));

endmodule

2021/7/1355状态机的测试模块always#50clock=~状态机设计的总结:有限状态机设计的一般步骤:

1)

逻辑抽象,得出状态转换图

2)

状态化简

3)

状态分配在触发器资源丰富的FPGA或ASIC设计中采用独热编码(one-hot-coding)既可以使电路性能得到保证又可充分利用其触发器数量多的优势,也可以采取输出编码的状态指定来简化电路结构,并提高状态机的运行速度。

4)选定触发器的类型并求出状态方程、驱动方程和输出方程。

5)

按照方程得出逻辑图2021/7/1356状态机设计的总结:有限状态机设计的一般步骤:2021/7/1状态机设计的总结:

用VerilogHDL来描述有限状态机,可以充分发挥硬件描述语言的抽象建模能力,使用always块语句和case(if)等条件语句及赋值语句即可方便地实现。具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成,上述设计步骤中的第2步及4、5步不再需要很多的人为干预,使电路设计工作得到简化,效率也有很大的提高。2021/7/1357状态机设计的总结:2021/7/1357逻辑电路的测试故障模型测试集合的复杂性路径的激活树状结构的电路随机测试时序电路的测试电路内部自测试(Build-inSelf-Test)线路板的测试2021/7/1358逻辑电路的测试故障模型2021/7/1358逻辑电路的测试

故障模型信号无法变化的模型

信号w总是固定在0或1:stuck_at_0表示为:w/0stuck_at_1表示为:w/1单个故障和多个故障

把多个故障问题简化为许多个单个故障问题来处理。CMOS电路的故障特点

晶体三极管的开路或短路:stuck_at_0或stuck_at_1

复杂的情形,不定态;组合逻辑变为时序逻辑的行为….2021/7/1359逻辑电路的测试

故障模型信号无法变化的模型2021/7/13逻辑电路的测试

测试集合的复杂性

想要知道模块中a,b,c,d,f端中是否有电平不能变化的,需要测试信号w1,w2,w3的各种变化组合。最全的情况有8种,最少有四种:测试集合={001,010,011,100}w1fw2w3dbac2021/7/1360逻辑电路的测试

测试集合的复杂性

想要知道模块中a,b逻辑电路的测试

测试路径的激活(Sensitizing)

把w1端的变化直接传到f端,必须把w2置1,w3置0,w4置1。这叫做从w1到f的路径被激活。W3=0fW2=1w1bacW4=12021/7/1361逻辑电路的测试

测试路径的激活(Sensitizing)

把逻辑电路的测试

树状结构的电路

最小测试集合的确定比较麻烦fW4

W1W4W2W2W3

W1W3 ̄W3 ̄ ̄ ̄2021/7/1362逻辑电路的测试

树状结构的电路

最小测试集合的确定比较麻烦f扫描路径的安排clockDQ

y3clockDQ

y2正常0/扫描1Dy1

Q组合逻辑电路111000扫描输入

Y3

Y2

Y1······2021/7/1363扫描路径的安排clockDQy3clockDQ电路内部自测试

(Build-inSelf-Test)在芯片中必须存储有对测试向量的正确响应,经过比较知道被测试电路是否有故障。测试向量被测试电路测试结果处理x0Pm-1P0Xn-12021/7/1364电路内部自测试

(Build-inSelf-Test)在芯四位内部逻辑块观察器

Built-inLogicBlockObserver(BILBO)M1M2的不同组合产生不同的功能10DQDQDQDQM1M2q0q2q3q1clockP0P1P2P3G/Ssinxor2021/7/1365四位内部逻辑块观察器

Built-inLogicBloc四位内部逻辑块观察器

(BILBO)的M1M2的不同组合时不同的功能

M1M2=11,正常系统模式,p0到p3直接传递到q0到q3;M1M2=00,当G/S=1时,为移位寄存器模式,测试矢量一位一位地移动进入,给被测试电路一位一位地加上测试信号。当G/S=0时,电路成为二进制伪随机序列发生器。(xor的两个为输入端相同时,输出为0,否则为1)M1M2=10,为签字模式,p0到p3与寄存器中存储的数比较后,得到签字输出q0到q3,相同为0,不同出现1。M1M2=01,复位模式,所有触发器置0。2021/7/1366四位内部逻辑块观察器

(BILBO)的M1M2的不同组合签字分析分五个步骤完成签字分析过程:组合电路块CN1组合电路块CN2BILBO1BILBO2扫描输出扫描输入2021/7/1367签字分析分五个步骤完成签字分析过程:组合电路块CN1组合电路签字分析的

五个步骤把测试向量一位一位地输入BILBO1,复位BILBO2。用BILBO1做伪随机序列信号源,用BILBO2产生签字分析结果。把BILBO2的内容逐位输出,在外面比较签字分析;然后逐位向BILBO2输入CN2的测试向量,启动测试;把BILBO1中的寄存器复位。用BILBO2做伪随机序列信号源,用BILBO1产生签字分析结果。把BILBO1的内容逐位输出,在外面比较签字分析。2021/7/1368签字分析的

五个步骤把测试向量一位一位地输入BILBO1,复

边界扫描电路的可测试性:可以施加测试向量,并可观察输出结果。电路的可测试性包括:芯片的可测试、线路板可测试、系统可测试。用移位寄存器的方法,把测试向量逐位移入寄存器,把测试结果逐位移出寄存器,与EDA仿真工具的结果进行比较,分析真实的物理线路是否运行正常。这个方法非常普及。已经建立有关边界扫描的国际标准:IEEEStandard1149.1.设计线路板、芯片都要符合国际标准。有自动化工具在芯片设计的过程中(功能逻辑设计结束后)插入有关DFT(DesignForTest)设计。2021/7/1369边界扫描电路的可测试性:可以施加测试向量,并可观察输出结果有关测试的总结小规模的电路可以进行全覆盖测试来验证它的功能。组合逻辑可以根据真值表来测试。时序逻辑可以根据状态转移表来测试。如果电路是根据上面介绍的可测试性来设计的,则小规模的电路进行完整的测试是比较容易的。大规模电路无法进行全覆盖的穷举测试,因为测试向量数量太大,必须动脑筋想办法找到可管理的有效测试集合,以节省测试时间。EDA工具对于得到设计电路的测试集是有帮助的,但是并不能确定电路的功能确实完全符合设计初衷。2021/7/1370有关测试的总结小规模的电路可以进行全覆盖测试来验证它的功能。语法要点详细讲解

有关测试模块编写的语法;语法的高级部分:函数、任务、文件、存贮器建立模型、双向总线、UDP、综合指令。。。。2021/7/1371语法要点详细讲解

2021/7/1371语法详细讲解

Verilog测试模块的编写目的:

复习如何编写较复杂的测试文件,对所做的设计进行完整的测试和验证。掌握组织模块测试的常用方法;学会编写常用的测试代码。2021/7/1372语法详细讲解

Verilog测试模块的编写目的:2021/语法详细讲解

用Verilog设计的步骤

注:虚线表示编译器能检查输入文件的可读性和是否存在以及是否允许生成输出文件include文件设计文件厂家元件库文件输入文件:激励和期望的输出信号输出文件:激励和实际输出的信号编译器仿真器仿真器2021/7/1373语法详细讲解

用Verilog设计的步骤注:虚线表示语法详细讲解

测试平台的组成

激励信号需要验证的设计激励信号和用于验证的结果数据需要验证的设计简单的测试平台复杂的测试平台2021/7/1374语法详细讲解

测试平台的组成激励需要验证的激励信号需要验语法详细讲解

并行块在测试块中常用到fork…join块。用并行块能表示以同一个时间起点算起的多个事件的运行,并行地执行复杂的过程结构,如循环或任务。举例说明如下:moduleinline_tb;reg[7:0]data_bus;initialforkdata_bus=8’b00;#10data_bus=8’h45;//这两个repeat开始执行时间不同,但能同时运行

#20repeat(10)#10data_bus=data_bus+1;#25repeat(5)#20data_bus=data_bus<<1;#140data_bua=8’h0f;joinendmodule2021/7/1375语法详细讲解

并行块在测试块中常用到fork…join块。语法详细讲解

并行块时间data_bus08’b0000_0000108’b0100_0101308’b0100_0110408’b0100_0111458’b1000_1110508’b1000_1111608’b1001_0000658’b0010_0000708’b0010_0001时间data_bus808’b0010_0010858’b0100_0100908’b0100_01011008’b0010_00011058’b0100_01101108’b1000_11001208’b1000_11101258’b0001_11001408’b0000_1111上面模块的仿真输出如下:2021/7/1376语法详细讲解

并行块时间data_bus时间语法详细讲解

强制激励在一个过程块中,可以用两种不同的方式对信号变量或表达式进行连续赋值。过程连续赋值往往是不可以综合的,通常用在测试模块中。两种方式都有各自配套的命令来停止赋值过程。两种不同方式均不允许赋值语句间的时间控制。

assign和deassign适用于对寄存器类型的信号(例如:RTL级上的节点或测试模块中在多个地方被赋值的信号)进行赋值。

initialbegin#10assigntop.dut.fsml.state_reg=`init_state;2021/7/1377语法详细讲解

强制激励在一个过程块中,可以用两种不同的方式对

#20deassigntop.dut.fsml.state_reg;endforce和release用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。

initialbegin#10forcetop.dut.counter.scan_reg.q=0;#20releasetop.dut.counter.scan_reg.q;end

在以上两个例子中,在10到20这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。force的赋值优先级高于assign。如果先使用assign,再使用force对同一信号赋值,则信号的值为force所赋的值,语法详细讲解

强制激励2021/7/1378#20deassigntop.du语法详细讲解

强制激励

当执行release后,则信号的值为assign所赋的值。如果用force对同一个信号赋了几次值,再执行release,则所有赋的值均不再存在。可以对信号的某(确定)位、某些(确定)位或拼接的信号,使用force和release赋值;但不能对信号的可变位使用force和release来赋值。不能对寄存器类型的信号某位或某些位使用assign和deassign来赋值。 2021/7/1379语法详细讲解

强制激励当执行releas虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。[例1]简单的对称方波时钟:regclk;alwaysbegin#period/2clk=0;#period/2clk=1;endreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period/2)go=1;end注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟模型产生的,则仿真器的性能就能得到提高。语法详细讲解

建立时钟2021/7/1380虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面r[例2]简单的带延迟的对称方波时钟:语法详细讲解

建立时钟regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。2021/7/1381[例2]简单的带延迟的对称方波时钟:语法详细讲解

建立时钟[例3].带延迟、头一个脉冲不规则的、占空比不为1的时钟:regclk;initialbegin#(period+1)clk=1;#(period/2-1)foreverbegin#(period/4)clk=0;#(3*period/4)clk=1;endendreggo;wireclk;nand#(3*period/4,period/4)ul(clk,clk,go);initialbegin#(period/4+1)go=0;#(5*period/4-1)go=1;end注:这两个时钟模型也有些不同,行为描述的模型一开始就有确定的电平,而门级描述的模型有延迟,开始时电平是不确定的。语法详细讲解

建立时钟2021/7/1382[例3].带延迟、头一个脉冲不规则的、占空比不为1的时钟:[例2]简单的带延迟的对称方波时钟:语法详细讲解

建立时钟regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,而门级描述的模型开始延迟有半个周期是不确定的。2021/7/1383[例2]简单的带延迟的对称方波时钟:语法详细讲解

建立时钟语法详细讲解

怎样使用任务举例说明如何使用任务:modulebus_ctrl_tb;reg[7:0]data;regdata_valid,data_rd;cpuul(data_valid,data,data_rd);initialbegincpu_driver(8’b0000_0000);cpu_driver(8’b1010_1010);cpu_driver(8’b0101_0101);end2021/7/1384语法详细讲解

怎样使用任务举例说明如何使用任务:2021/7语法详细讲解

怎样使用任务taskcpu_driver;input[7:0]data_in;begin#30data_valid=1;wait(data_rd==1);#20data=data_in;wait(data_rd==0);#20data=8’hzz;#30data_valid=0;endendtaskendmodule2021/7/1385语法详细讲解

怎样使用任务taskcpu_driver;2语法详细讲解

怎样使用任务

在测试模块中使用任务可以提高程序代码的效率,可以用任务把多次重复的操作包装起来。waitwaitwaitwaitdata1data2data3data4cpu_data

clkdata_validdata_rdread_cpu_state2021/7/1386语法详细讲解

怎样使用任务在测试模块中使用任务可以提高语法详细讲解

存储建模目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口,(inout)建模。2021/7/1387语法详细讲解

存储建模目标2021/7/1387存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作:

1)只读

2)读写

3)同步读写

4)多次读,同时进行一次写

5)多次同步读写,同时提供一些方法保证一致性语法详细讲解

存储器建模2021/7/1388存储器建模必须注意以下两个方面的问题:语法详细讲解

存储器建`timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input[3:0]addr;output[3:0]read_data;reg[3:0]read_data;reg[3:0]mem[0:15];initial$readmemb(“my_rom_data”,mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodule语法详细讲解

简单ROM建模my_rom_data

0000010111000011110100100011111110001001100000011101101000011101ROM的数据存储在另外的一个独立的文件中2021/7/1389`timescale1ns/10ps语法详细讲解

简单ROM建模上页所示的ROM模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。2021/7/1390语法详细讲解

简单ROM建模上页所示的ROM模型说明:202语法详细讲解

简单RAM建模`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;inout[3:0]addr;inputread,write;reg[3:0]memory[0:15];//4bits,16个单元//从存储器读出到总线上

assigndata=read?memory[addr]:4’bz;//从总线写入存储器

always@(posedgewrite)memory[addr]=data;endmodule2021/7/1391语法详细讲解

简单RAM建模`timescale1ns/1语法详细讲解

简单RAM建模RAM模型比ROM模型稍微复杂:它必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,RAM模型与总线脱离,如果此时写信号也无效,总线无驱动源,则总线进入高阻状态,这就避免了RAM中的读写竞争。上页的RAM模块是可综合的,但综合出来是一大堆寄存器,占比较大的面积,经济上不太合算。2021/7/1392语法详细讲解

简单RAM建模RAM模型比ROM模型稍微复杂:例:modulescalable_ROM(mem_word,address);parameteraddr_bits=8;//sizeofaddressbusparameterwordsize=8;//widthofawordparameterwords=(1<<addr_bits);//sizeofmemoutput[wordsize:1]mem_word;//wordofmemoryinput[addr_bits:1]address;//addressbus

reg[wordsize:1]mem[0:words-1];//memdeclaration//outputonewordofmemorywire[wordsize:1]mem_word=mem[address];endmodule语法详细讲解

存储量可变的只读存储器建模2021/7/1393例:语法详细讲解

存储量可变的只读存储器建模2021/7/1语法详细讲解

存储量可变的只读存储器建模

上述的例子演示了怎样通过设置字长和地址位数来编写只读存储器的行为模块。

[注意]!!在上例中,存储字的范围从0开始的,而不是从1开始,这是因为存储单元是直接通过地址线寻址定位的。同样地,也可以用下面的方法来定义存储器和寻址:

reg[wordsize:1]mem[1:words];//存储器地址从1开始

//地址一个一个地增加直到包含了每个地址对应的存储器

wire[wordsize:1]mem_word=mem[address+1];2021/7/1394语法详细讲解

存储量可变的只读存储器建模上述的例子演示

可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。

使用循环把值赋给存储器数组。

for(i=0;i<memsize;i=i+i)//initializememorymema[i]={wordsize{1’b1}};调用$readmem系统任务。

//从文件mem_file.txt中,把初始数据存入存储器(mem)的每个单元

$readmemb(“mem_file.txt”,mem);

注意:上面两项必须写在initial块中,加载这些初始化数据不需要时间。语法详细讲解

存储器的加载2021/7/1395可以在初始化块中用一个循环或系统任务把初始数据存入语法详细讲解

怎样使用双向口使用inout关键字声明端口为双向口。

inout[7:0]databus;使用双向口必需遵循下面的规则:inout口只能声明为网络连接类型,不允许把它声明为寄存器类型。(所以仿真器能确定多个驱动源的最终值。)在设计中,每次只能从一个方向来驱动inout口。例如:当使用总线读RAM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。2021/7/1396语法详细讲解

怎样使用双向口使用inout关键字声明端口为双语法详细讲解

怎样使用双向口[注意]:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类型通过连续赋值语句赋给它(inout口),或者把它与用户定义的源语(UDP)相连。必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。2021/7/1397语法详细讲解

怎样使用双向口[注意]:2021/7/1397使用Verilog中的基本元件(bufif1)为双向口建模:语法详细讲解

双向口建模b2b1en_a_ben_b_abus_abus_b2021/7/1398使用Verilog中的基本元件(bufif1)为双向口建模:语法详细讲解

双向口建模[注意]:

在上页的例子中,使用en_a_b和en_b_a来控制元器件bufifl,如果控制信号同时有效,则结果无法确定。所以必须把控制信号en_a_b和en_b_a在时间上分开。modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufiflb1(bus_b,bus_a,en_a_b);bufiflb2(bus_a,bus_b,en_b_a);//结构模块逻辑endmodule当en_a_b=1时,元器件b1激活,bus_a的值传到bus_b上当en_b_a=1时,元器件b1激活,bus_b的值传到bus_a上2021/7/1399语法详细讲解

双向口建模[注意]:mod

温馨提示

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

评论

0/150

提交评论