计算机语言 语法详细讲解_第1页
计算机语言 语法详细讲解_第2页
计算机语言 语法详细讲解_第3页
计算机语言 语法详细讲解_第4页
计算机语言 语法详细讲解_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

语法详细讲解

强制激励

.•■在一个过程块中,可以用两种不同的方式对信号变量或表达式进

.•行连续赋值。

■过程连续赋值往往是不可以综合的,通常用在测试模块中。

-两种方式都有各自配套的命令来停止赋值过程。

一♦■两种不同方式均不允许赋值语句间的时间控制。

■assign和deassign适用于对寄存器类型的信号(例如:RTL级上

:的节点或测试模块中在多个地方被赋值的信号)进行赋值。

I.initialbegin

I.#10assigntop.dut.fsml.statereg='initstate;

语法详细讲解

强制激励

#20deassigntop.dut.fsml.statereg;

♦end

♦■force和release用于寄存器类型和网络连接类型(例如:门级扫

•描寄存器的输出)的强制赋值,强制改写其它地方的赋值。

.initialbegin

.#10forcetop.dut.counter.scanreg.q=0;

#20releasetop.dut.counter.scanreg.q;

•end

・在以上两个例子中,在10到20这个时间段内,网络或寄存器类型

•的信号被强制赋值,而别处对该变量的赋值均无效。

.fbrce的赋值优先级高于assign。

如果先使用assign,再使用force对同一信号赋值,则信号的值

为force所赋的值,

语法详细讲解

强制激励

当执行release后,则信号的值为assign所赋的值。

如果用force对同一个信号赋了几次值,再执行release,则

所有赋的值均不再存在。

可以对信号的某(确定)位、某些(确定)位或拼接的

信号,使用force和release赋值;但不能对信号的可变位使

用force和release来赋值。

不能对寄存器类型的信号某位或某些位使用assign和

deassign来赋值。

.语法详细讲解

•建立时钟

•------------------

.虽然有时在设计中会包含时钟,但时钟通常用在测试模块中。下面

•三个例子分别说明如何在门级和行为级建立不同波形的时钟模型。

•[例1]简单的对称方波时钟:

reggo;wireelk;

〃.regelk;

nand#(period/2)ul(elk,elk,go);

.alwaysbegin

initialbegin

,•#period/2clk=O;

go=0;

•#period/2clk=l;

#(period/2)go=l;

一•enjd

end

注:在有些仿真器中,如果设计所用的时钟是由与其相同抽象级别的时钟

模型产生的,则仿真器的性能就能得到提高。

语法详细讲解

建立时钟

..[例2]简单的带延迟的对称方波时钟:

regelk;

reggo;wireelk;

initialbegin

nand#(period/2)ul(elk,elk,go);

*clk=0;

initialbegin

#(period)

go=0;

forever

#(period)go=l;

#(period/2)clk=!clk

end

end

♦注:这两个时钟模型有些不同,行为描述的模型延迟期间一直是低电平,

而门级描述的模型开始延迟有半个周期是不确定的。

语法详细讲解

建立时钟

.•[例3].带延迟、头一个脉冲不规则的、占空比不为1的时钟:

♦regelk;

initialbeginreggo;wireelk;

#(period+l)clk=l;nand#(3*period/4,period/4)

ul(clk,clk,go);

#(period/2-l)

initialbegin

foreverbegin

#(period/4+l)go=0;

#(period/4)clk=0;

#(5*period/4-l)go=l;

#(3*period/4)clk=l;

end

end

注:这两个时钟模型也有些不同,行为描述的模型一开始就有确定的

电平,而门级描述的模型有延迟开始时电平是不确定的。

语法详细讲解

怎样使用任务

..moculebusctrltb

..reg[7:0]data;

•regdatavalid,datard;

•cpuul(data_valid,data,data_rd);

r•initialbegin

•cpu_driver(8'bOOOO_OOOO);

,cpu_driver(8'bl010」010);

*cpu_driver(87b01010101);

end一

taskcpudriver;

语法详细讲解

怎样使用任务

input[7:0]datain;

begin

#30data_valid=l;

wait(data_rd==1);

#20data=datain;

wait(data口5・

#20data=8'hzz;

#30datavalid=O;

end

endtask

语法详细讲解

存储建模

・目标

:■学会使用Verilog进行存储建模。

(♦■学会在Verilog中进行双向口建模。

语法详细讲解

,存储设备建模

,存储设备建模必须注意以下两个方面的问题:

.,■声明存储容量的大小。

•提供对内容的访问权限,例如:

9——只读

,——读写

D——同步读写

.——多次读,同时进行一次写

——多次同步读写,同时提供一些方法保证一致性

语法详细讲解

简单ROM建模

rnyrom.vmy_rom_data

'timescaleIns/lOps

modulemyrom(read_data,addr,readen);

inputread_en_;。。口

input[3:0]addr;1101

output[3:0]readdata;0010

reg[3:0]readdata;0011

reg[3:0]mem[0:15];1111

initial1000

$readmemb("myromdata”,mem);1001

always@(addrorreadenj1000

0001

if(!read_en_)ROM的数据存储在另外

1101

的——个独立的文件中

read_data=mem[addr];1010

endmodule0001

1101

语法详细讲解

简单ROM建模

上面所示的ROM模型中使用二维的存储寄存器来定义存储容量。

ROM中的数据保存在一个独立的文件中,如上面的右边所示。这是

一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。

语法详细讲解

简单RAM建模

.'timescaleIns/lns

modulemymem(data,addr,read,write);

•inout[3:0]data;

.inout[3:0]addr;

inputread,write;

•reg[3:0]memory[0:15];//4bits,16words

.//read

assigndata=read?memory[addr]:4'bz;

―//write

•always@(posedgewrite)

.memory[addr]=data;

endmodule

・RAM模型比ROM模型稍微复杂,因为它必须具有读写能力,而进行读写时

•通常使用相同的数据总线,这就需要新技术来处理双向总线。当读出口没

>有被激活时,RAM模型不再激励总线,如果此时的总线写入变量也没有被激

活,则总线进入高阻状态,这就避免了RAM中的读写竞争。

语法详细讲解

简单RAM建模

上述模型是可综合的,但是许多工具只产生一系列的寄存器,这一般

就需要更大的空间,从而比实际的存储器的价格更昂贵。

语法详细讲解

容量可变的存储器建模

L.例:

.modulescalable_ROM(mem_word,address);

.parameteraddr_bits=8;//sizeofaddressbus

parameterwordsize=8;//widthofaword

•parameterwords=(l«addr_bits);//sizeofmem

.output[wordsize:1]memword;//wordofmemory

.input[addr_bits:1]address;//addressbus

•reg[wordsize:1]mem[0:words-l];//memdeclaration

//outputonewordofmemory

wire[wordsize:1]mem_word=mem[address];

''endmodule

语法详细讲解

・容量可变的存储器建模

■-------------------------

.•上述的例子演示了怎样通过设置字长和地址位数来定义一个只读

.存储设备。

在上例中,存储字的范围从0开始的,而不是从1开始,这是因为

内存是直接通过地址线定位的,同样地,也可以用下面的方法来

定义内存和定位:

reg[wordsize:1]mem[1:words];//memorystartsatword1

.//addressmustbeincrementedtoaddressallwordsinmemory

.wire[wordsize:1]mem_word=mem[address+1];

语法详细讲解

载入存储设备

可以通过使用一个循环或系统任务来载入存有数据的整个存储

器。

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

for(i=0;i<memsize;i=i+i)//initializememory

mema[i]={wordsize{1'b1}};

■调用$readmem系统任务。

//loadmemorydataformafile

$readmembCtmem_file.txt,,,mem);

语法详细讲解

怎样使用双向口

.•使用inout关键字声明双向口。

.inout[7:0]databus;

,使用双向口需要遵循下面的规则:

>-一个inout口只能声明为网络类型,而不能是寄存器类型的。

•因此仿真器能确定多个激励源的最终值。

.■在设计中,每次只能激活inout的一个方向。

.——例如:当使用总线读RAM中的数据时,同时又向RAM模

・型的双向数据总线写数据,就会产生逻辑竞争,导致总

・线脱离。

■——必须为inout口设计控制逻辑,用来保证正确的操作。

语法详细讲解

怎样使用双向口

注:

,•■可以声明一个inout口,用来输入或输出数据。inout口默认为网络

.类型,不可以对网络类型的数据进行过程赋值,但可以在过程块

,外对寄存器数据类型进行连续赋值,或者把它与元器件相连。

■必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口

♦做为输入口时,必须使输出逻辑失效。

,・

语法详细讲解

双向口建模

使用元器件

语法详细讲解

双向口建模

.•注:在上页的例子中,使用了en_a_b和en_b_a来控制元器件bufifl,如

.果进行同时控制,则得不到赫丽的结桌「

语法详细讲解

双向口建模

使用连续赋值

ba

(busa,busb,ena_b,enba);

inoutbusa,busb;当ena_b二1时,bus_a的

值传到bus_b上

inputen_ab,enba;

assignbus_b=en_a_b?bus_a:'bz;

assignbus_a=en_b_a?bus_b:'bz;

当enba=1时,busb的

〃结构模块逻辑

值传到bus_a上

endmodule

语法详细讲解

双向口建模

注:在assign语句中,通过en_a_b和en_b_a控制busa与busb之间

的数据交换。——————

如果进行同时控制,则得不到预期的结果。

语法详细讲解

双向口建模

存储口建模

测试模块

数据

wr

moduleramcel1(databus,rd.wr);当rd等于1时

inoutdatabus;datareg的值被赋

inputrd,wr;给databus

regdatareg;

assigndatabus=rd?datareg:?bz;

当wr的下降沿到

always@(negedgesr)

达时,databus的值

datareg<=databus;---------

被写入datareg

endmodule

语法详细讲解

双向口建模

注:上页存储单元在wr的下降沿到达时存入数据。上页模块在wr

处于高电平时,通过数据总线写入数据,但必须保证wr的高电

平维持时间长于数据的写入时间。

在rd处于高电平时,上述存储单元通过数据总线读出数据。由

于此模型为单口存储模型,因此wr和rd不能同时为高电平,否

则就得不到预期的结果。

语法详细讲解

f第十七部分Verilog中的高级结构

,目标

,■学会怎样定义或调用任务和函数。

■学会怎样使用命名块。

..■学会怎样使命名块和任务失效。

.■熟悉有限状态机及怎样进行有限状态机显式建模。

语法详细讲解

第十七部分Verilog中的高级结构

可以通过把代码分成小的模块或者使用任务和函数,来把一项任务

分成许多较小的、易于管理的部分,从而提高代码的重用性。

■任务

一般用于执行调试操作,或者行为的描述硬件

可以包含时间控制(#delays,@,wait)

可以包含input,output和inout参薮

可以调用其他的任务或函数

■函[

一般用于计算,或者用来代替组合逻辑

不能包含任何延迟;函数在零时间执行

只能使用input参数,但可以通过函数名来返回一个值。

可以调用其他的函数,但不可以调用任务

语法详细讲解

f第十七部分Verilog中的高级结构

,注:

.■必须在模块内调用任务和函数。

:■在任务和函数中不能声明连线类型的变量。

4■所有的输入和输出都是真正的本地寄存器类型的数据

o

'•'只有当任务或函数调用并执行完后,才能有返回值。

•例如:当任务或函数中包含一个forever循环时,就不

•可能有返回值。

语法详细讲解

Verilog任务

下面的任务含有时间控制和一个输入,并且指向一个模块变量

,但是不包含输出、总线和内部变量,不显示任何内容。

时间控制中使用的信号(例如elk)不必是任务的输入,这是因

为输入值只向任务内部传递一次。

moduletop;

regelk,a,b;

DUTul(out,a,b,elk);

always#5clk=!clk;

tasknegclocks;

input[31:0]numberofledges;

repeat(numberof^edges)

语法详细讲解

Verilog任务

@(negedgeelk);

endtask

initialbegin

clk=0;a=l;b=l;

neg_clocks(3);〃任务调用

a=0;

negclocks(5);

b=0;

end

endmodule

.主要特征:

•■任务调用是通过在Verilog模块中写入任务名来实现的。

•■任务中可以包含input,output和inout参数。

•语法详细讲解

SVeriIog任务

--传递给任务的参数与任务i/。声明参数的顺序相同。虽然传递给

’任务的参数名可以和任务内部I/O声明的参数名相同,但是为了

♦提高任务的模块化程度,传递给任务的参数名通常是唯一的,

.而不使用与任务内部I/O声明的参数名相同的参数名。

_■在任务中可以使用时间控制。

,•■在Verilog中,任务定义了一个新的范围。

.■使用关键字disable禁止任务。

注意:不要在程序的不同部分同时调用同一个任务。这是因为任

»务只有一组本地变量,同时调用两次将会导致错误。这种情况

..通常发生在使用时间控制的任务中。

在任务或函数中,应给在父模块中声明的变量加注释。若在其

.它模块中调用任务或函数,任务和函数中所使用的变量必须包

含在输入/输出口列表中。

语法详细讲解

Verilog任务

F面模块中的任务含有一个双口总线和一个内部变量,但是没有输入、

输出和定时控制,没有引用本模块的变量,不显示任何内容。

在任务调用时,任务参数(口)类型被视为内部寄存器类型。

parameterMAX_BITS=8;

reg[MAXBITS:1]D;

taskreverse_bits;

inout[7?0]data;〃双口总线被视为寄存器类型!

integerK;

for(k=0;k<MAX_BITS;K=K+1)

reverse_bits[MAXBITS-(K+l)=data[K];

endtask

always@(posedgeelk)

reversebits(D);

语法详细讲解

Verilog任务

F面模块中的任务含有输入、输出、时间控制和一个内部变量,

并且引用了一个本模块的变量,但是没有输出,不显示任何内容。

任务调用时的参数顺序应与任务定义中声明的顺序相同。

modulemult(clk,a,b,out,enmult);

inputelk,enmult;

input[3:0]a,b;

output[7:0]out;

reg[15:0]out;

always@(posedgeelk)

multme(a,b,out);〃任务调用

语法详细讲解

Verilog任务

taskmuotme;〃任务定义

input[3:0]xme,tome;

output[7:0]result;

wait(en_mult)

result=xme*tome;

endtask

endmodule

语法详细讲解

VeriIog函数

$moduleorand(a,b,c,d,e,out);

input[7:0]a,b,c,d,e;

•output[7:0]out;

.reg[7:0]out;

always@(aorborcordore)

*out=f^or_and(a,b,c,d,e);〃函数调用

function[7:0]f^orand;

input[7:0]a,b,c,d,e;

if(e==l)

f^or_and=(a|b)&(c|d);

else

f^or_and=0;

endfunction

endmodule

语法详细讲解

VeriIog函数

虽然函数不能包含定时控制,但是可以在包含定时控制的过程

块中调用函数。

♦在上述函数中使用了函数名Lojand作为寄存器类型的变量。

,

要点

■■八函数定义不能包含定时控制语句。

■•■函数必须含有输出,但不能含有输出和总线口;

♦-一个函数只能返回一个值,该值的变量名与函数同名,数据类

.型默认为reg类型。

■传递给函数参数的顺序与函数输入参数声明的顺序相同。

•-函数定义必须包含在模块定义之内。

••函数不能调用任务,但任务可以调用函数。

.■函数使Verilog有更广阔的适用范围。

语法详细讲解

VeriIog函数

-虽然函数只能返回一个值,但是它们的返回值可以直接的赋给

一个信号拼接,从而使它们有多个输出。

{ol,o2,o3,o4}=f^or_and(a,b,c,d,e);

语法详细讲解

命名块

■可以通过在关键字begin或fork后加上:〈块名〉来给块命名。

modulenamedblk;

begin:seq_blk

end

fork:parblk

join

endmodule

■可以在命名块中声明本地变量。

■可以使用disable禁止命名块。

语法详细讲解

命名块

汪思:

■命名块使Verilog有更广阔的适用范围。

-命名块的使用缩短了仿真的时间。

语法详细讲解

禁止命名块和任务

moduledo_arith(out,a,b,c,d,e,elk,en_mult);

'.inputelk,enmult;

,input[7:0]a,b,c,d,e;

output[15:0]out;

reg[14:0]out;

.always@(posedgeelk)

begin:arithblock〃***命名块***

・reg[3:0]tmpl,tmp2;//***本如变量***

.{tmp,tmp2}=^or_and(a,b,c,d,e);//函数调用

”if(en_mult)multme(tmp1,tmp2,out);〃任务调用

>•end

always@(negedgeenmult)begin〃停止计算

disablemultme;〃***禁止任务的执行***

diablearithblock;//***禁it命名块的执行***

end

〃在此定义任务和函数

endmodle

语法详细讲解

禁止命名块和任务

注意:

-disable语句用来终止命名块或任务的执行,因此可以在执行所

有的语句前,就能从命名块或任务的执行中返回。

语法:

disable〈块名〉

disable〈任务名〉

-禁止执行命名块或任务后,所有在事件队列中安排的事件都将

被删除。

■在综合中一般不支持disable语句。

在上页的例子中,只禁止命名块也可以得到预期的结果:命名块

中所有的事件、任务和函数的执行都将被取消。

语法详细讲解

有限状态机(FSM)

,

.隐式FSM:

■不需要状态寄存器

•■仿真更加有效

•■只露很好的处理线形状态改变

语法详细讲解

有限状态机(FSM)

显式FSM:

■结构更加复杂

-可以很方便的用来处理默认状态

■能够处理复杂的状态改变

-所有的综合工具均支持显式FSM

stateA

语法详细讲解

有限状态机(FSMs)

注意:

在隐式FSMs中,无论什么时候在一个时钟周期内写数据和在

在另一个时钟周期内读数据,都会创建寄存器。

所有的FSMs都必须能复位,状态改变必须与一个单一的时钟

信号同步。

■一般的,如果状态改变比较简单,又定义的比较好,而且综合

工具支持隐式状态机,就可以使用隐式类型。如果状态改变比

较复杂,最好使用显式类型,这样会更加有效。

隐式状态机应属于行为级,而不应属于RTL级,代码中主要包

含循环、嵌入的定时控制,有时也含有命名事件、wait和

disable语句。因此,综合中一般不支持隐式机。

语法详细讲解

VeriIog函数

要返回一个矢量值(超过一个位宽),可以在函数名前声明变

量的位宽。在函数中,将语句放在begin和end块中。

在函数中无论多少次对函数名进行赋值,值只返回一次。下面

的函数中声明了一个内部整型变量。

modulefoo;

input[7:0]loo;

output[7:0]goo;

〃可以从连续赋值中调用函数

wire[7:0]goo=zero_count(loo);

function[3:0]zerocount;

input[7:0]inbus;

语法详细讲解

VeriIog函数

integerI;

begin

zero_count=0;

fbr(I=O;I<8;1=1+1)

if(!in__bus[I])

zerocount=zerocount+1;

end

endfunction

endmodule

语法详细讲解

VeriIog函数

可以声明函数的返回值的类型为integer、real或time,可以在

任何表达式中调用函数。

modulechecksub(neg,in_a,in_b);

outputneg;

regneg;

functioninteger_subtr;

input[7:0]in_a,in_b;

subtr=in_a-in_b;〃结果可能是负数

endfunction

always@(aorb)

if^subtr(a,b)<0)

neg=l;

elseneg=0;

endmodule

语法详细讲解

VeriIog函数

可以给返回变量的每一位赋值,还可以参数化函数的大小、函

数口、甚至函数的行为。

parameterMAX_BITS=8;

reg[MAXBITS:!!D;

function[MAXBITS:1]reverse_bits;

input[7:0]data;

integerK;

fdr(K=0;K<MAX_BITS;K=K+1)

reversebits[MAX_BITS-(K+1)]=data[K];

endfunction

always@(posedgeelk)

D=reverse_bits(D);

语法详细讲解

显式有限状态机

moduleexp(out,datain,elk,rst);

inputelk,rst,datain;

outputout;regout;

retstate;-------------状态变量

always@(pasedgeelkorposedgerst)datain

if(rst){state,out}=2'b00;

else

case(state)--------case语句

rbO:begin

out=rbO;

if(!datain)state=rbO;

elsestate=rbl;

end

rblbegin

语法详细讲解

显式有限状态机

.out=datain;

statesTbO;<-----------转到下一个状态

,end

♦default:{state,out)=2^00;----------默认状态指针

1elkrst

..endcase

dendmodule口-

।♦识别ii序歹!—kout

注:

,•■可以在过程块中使用一个单一的时钟沿和一个case语句来描述

[.一个显式状态机。

’.-必须规定一个状态变量,用来定义状态机的状态。

,•"要改变当前的状态,必须改变状态变量的值,状态变量的值的

・改变要与时钟沿同步。

,.-最好为通常不会发生的状态规定默认动作。

语法详细讲解

隐式有限状态机

-•moduleimp(out,datain,elk,rst);datain=0

,outputout;regout;

一.inputelk,datain,rst;

.always@(rst)〃协同复位方法

.if(rst)assingout=l'bO;datain

else

|.begin

deassignout;

disableseq_block;〃返回到初始状态

end

always@(posedgeelk)

语法详细讲解

隐式有限状态机

begin:seq_block

out=rbO;

if(!datain)〃状态一:输出零

disableseq_block;

@(posedgeelk)〃状态二:输出第二位

out=datain;

end

endmodule

kr

THUZHoM-识别ii序列°ut

语法详细讲解

Q隐式有限状态机

,•注意:

•一可以在过程块使用多个时钟沿(一个状态一个)、条件语句、循

一.环语句、disable语句来描述隐式FSM。

L."不必定义一个状态变量。

"若没有强制状态重复(例如:在循环语句或disable语句中强制状

|态重复),当下一个激活时钟沿到达时,状态改变。下一个装态

f将由条件语句决定。

•口在隐式状态机中,很难规定一个默认动作。

语法详细讲解

第十八部分用户定义的原语

目标

-学会怎样创建逻辑使用的用户定义的原语。

■用户定义的原语(UDP)的行为与嵌入的Verilog原器

件相似,可以用一个表格来定义它的功能。

语法详细讲解

什么是UDP?

在Verilog结构模型中,可以使用:

-二十多个门级原器件。

■用户定义的原语。

UDP可用于ASIC库单元设计和小规模芯片和中规模芯片设计。

-可以使用UDP扩大预定义原器件的范围。

-UDP是自包含的,不能调用其他的模块。

■UDP既可以用来代替时序逻辑元件,也可以代替组合逻辑元件。

■使用真值表来描述UDP的行为。

调用UDP的方式与调用嵌入的原器件的方式相同。

语法详细讲解

什么是UDP?

-UDP是一种很好的代替逻辑方式。

■在嵌入原器件中,输入中包含的x不能在输出时自动

转变成x,而在UDP中则不会出现此种情况。

-UDP可以代替许多原器件逻辑。另外,UDP的仿真时

间和内存需要大大低于运行分立原器件。如果仿真工

具合适,相同逻辑的行为模型甚至可以更快。

•语法详细讲解

•特征

••UDP只能有一个输出端,而且必须是端口的说明列表

■的第一项。

■"UDP可以有多个输入端,最多允许有10个。

•-UDP所有端口变量必须是标量,不允许使用双向端口。

■-UDP不支持Z逻辑值。

・■在仿真的开始,UDP的输出可以使用initial语句初始

•化为一个已知值。

,■UDP不能被综合。

•语法详细讲解

・特征

・注:

••UDP只能有一个输出。如果设计时的输出多于一个,则需要把其

.它的原器件连接到UDP输出,或同时使用多个UDP。

-UDP输入端最多可以有10个,但是当输入的个数多于5个时,

・内存的需要将大大的增加。下页表列出了输入数目不同时,每个

一输入所需要的内存。

语法详细讲解

特征

#输入内存

1-5<1

65

717

856

9187

10623

语法详细讲解

示例

■注:

.-在模块外定义UDP。

.・如果在表中没有规定输入组合,将输出X。

-表的列中元素的顺序应与端口列表中的一致。

•・表中的?的意义是:重复的输入0,1或x;逻辑值。

•-表中开始两行表示:当s等于1时,不管b如何取值,输出。将与输入a

保持一■致。

.表中的下两行表示:当s等于。时,不管a如何取值,输出。将与输入b

〜保持一致。

•表中的最后两行使此器件更加的全面、准确。它们表示:当输入a和b

■的逻辑值相同时,如果sei等于x,则输出o的值将与输入a和b的值相

.同。这种行为不能使用Verilog嵌入原器件进行建模。UDP将x作为实际

的未知值,而不是Verilog值来进行处理,使其比嵌入原器件更加准确。

语法详细讲解

组合示例:全加器

可以仅使用两个UDP设计全加器。

.〃全加器进位实现部分

primitiveU_ADDR2_C(C0,A,B,CI);

outputCO;

inputA,B,CI,

B»c

L

table//八11C?I1

--•

1911夕

-i•

?-11xe

1-•

o?o夕

O、

O夕

o7or

?6Oo

endtalbe

♦endprimitive

*

.

语法详细讲解

组合示例:全加器

〃全加器求和实现部分

.primitiveU_ADDR2_S(S,A,B,CI);

outputS;

inputA,B,CI;

'•table//B

noo

M

O

o11

11

1o1

11

11

11

1oo1

11

1o1

11

11oc

11(>)

111

1111

endtable

.endprimitive

语法详细讲解

组合逻辑示例:全加器

•若使用UDP设计全加器,仅需要两个UDP;而使用Verilog嵌入

.原器件,则需要5个Verilog嵌入原器件。

.•大量使用全加器时,这将大大减少内存的需要。

-事件的数目将大大降低。

■?代表0,1或X。

语法详细讲解

级触发时序逻辑示例:锁存器

primitivelatch(q,clock,data);

outputq;注意此寄存器的用法,

*regq;---------此寄存器用来存储。

.inputclock,data;

initialq=l'bl;<输出初始化为

table1'bl.

.//clockdatacurrentnext

.//statestate

・01:?1;

・00:?0;

.1?::

endtable

•endprimitive

?表示无须考虑输入

和当前状态的值

语法详细讲解

级触发时序逻辑示例:锁存器

注:

.•-锁存器的动作行为如下:

一•当时钟信号为0时,输入数据的值直接传给输出。

当时钟信号为1时,输出保持当前状态不变。

・nextstate栏中的表示输出保持不变。

:.・输出必须定义为寄存器类型,用来保存前一个状态。

|-initialq=l,bl;是时序UDP的初始化语句。使用此语句可以在仿

真的开始对输出进行赋值。

・在实际的部件模型中,很少使用初始赋值。但在测试UDP的功能

•时,初始赋值相当有用。

语法详细讲解

边沿敏感的时序逻辑示例:D触发器

-•primitivededgeff(q,elk,data);

..outputq;

一.inputelk,data;

-regq;

.table//elkdatstatenext

(01)0:?:0;

H(Ox)1:1:1;

(Ox)0:0:0;

(xl)0:0:0;

(xl)1:1:1;

语法详细讲解

边沿敏感的时序逻辑示例:D触发器

.一//忽略时钟的下降沿

.,(?0)

(1X)?:?:-;

,.//忽略时钟稳定时的数据改变

.endtable

.endprimitive

口在大多数情况下,可以在任何表入口语句中规定一个输入过渡。

如果规定了任何输入过渡,则必须规定所有输入的所有过渡。

语法详细讲解

第十九部分Verilog综合建模类型

•建模类型概述

在任何时候,如果输出直接由当前的输入组合决定,则此逻辑为

组合逻辑。

如果逻辑中具有记忆功能,则此逻辑为时序逻辑。在任何给定的

时刻,如果输出不能由输入的状态确定,则此逻辑具有记忆功能。

语法详细讲解

不受支持的Verilc结构

综合工具一般不支持下面的Verilog结构:

.initial

一•一些循环语句:

.repeat

|.forever

while

F*for的非结构用法

:一些数据类型

event

real

time

语法详细讲解

不受支持的Verilc结构

.•UDPs

■fork...join

.wait

过程连续赋值语句

.assign和deassign

force和release

,一一些操作符

语法详细讲解

过程块

■两个边沿的任一个

过程块到达所有输入信号的任一个边沿产生组合逻辑。此块称为

组合块。

always@(aorb)〃实现与门

y=a&b;

■单个边沿

过程块到达控制信号的单个边沿(下降沿或上升沿)产生同步逻

辑。此块称为同步块。

always@(posedgeelk)〃实现D触发器

q<=d;

语法详细讲解

Q过程块

同步块也可能对异步复位信号的改变敏感。

>always@(posedgeelkornegedgerst_)

if(!rst_)

q<=0;

.else

-qv=d;

--语法详细讲解

•过程块中寄存器类型的信号变量

.•当在同步块中使用reg类型的信号变量时:

•如果此信号变量在一个时钟周期中被附值,而在另一个时钟周期

.中创建了其实例,则此信号变量仅作为硬件寄存器使用。

\如果此信号变量也是基本输出,则其将显示在综合列表中,但不

一定是硬件寄存器。

・,否则,信号可以被优化掉。

•当在组合块中使用reg类型的信号变量时:

♦•如果当块的任何输入的值改变时,此信号变量的值也随之改变,

・则此信号变量在综合输出中并不属于硬件寄存器。

-如果当块的任何输入的值改变时,此信号变量的值并一定改变,

一则此信号变量在综合输出中属于锁存器。

语法详细讲解

奇C±zi存T-肃□□

同步寄存器示例

..在下面的例子中,rega仅用作临时存储器,因此它被优化掉。

moduleexlreg(d,elk,q);

inputd,elk;

.•outputq;

.regq,rega;

always@(posedgeelk)

begin

।•rega=0;

|.if(d)rega=l;

q=rega;

।end

••endmodule

语法详细讲解

奇C±zi存T-肃□□

在下面的例子中,两个时钟沿包含两个存储兀素,因此rega未被

..优化掉。

.moduleex2reg(d,elk,q);

.inputd,elk;

outputq;

Iregq,rega;

always@(posedgeelk)

begin

•rega=0;

if(d)rega=l;

•・end

语法详细讲解

奇存肃

•always@(posedgeelk)

q=rega;

endmodule

注:在后面的例子中,块执行的顺序是不确定的,因此q可以获得

在前一个周期中赋给rega的值。

语法详细讲解

奇C±zi存T-肃□□

组合寄存器示例

>在下面的两个例子中,rega是一个临时变量且被优化掉。

,•在下面的例子中,y和rega不断被赋新值;因此,下例是一个纯

.的组合逻辑。

.moduleex3reg(y,a,b,c);

.inputa,b,c;

outputy;

regy,rega

温馨提示

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

最新文档

评论

0/150

提交评论