




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语法详细讲解
强制激励
.•■在一个过程块中,可以用两种不同的方式对信号变量或表达式进
.•行连续赋值。
■过程连续赋值往往是不可以综合的,通常用在测试模块中。
-两种方式都有各自配套的命令来停止赋值过程。
一♦■两种不同方式均不允许赋值语句间的时间控制。
■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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国工业级人造金刚石行业市场分析及投资价值评估前景预测报告
- 2025年中国个人用IPL 脉冲光脱毛电器设备行业市场分析及投资价值评估前景预测报告
- 创建登录窗体教学设计中职专业课-数据库应用基础-Access-计算机类-电子与信息大类
- 2025年航空航天金纳米粒子涂层技术应用发展报告
- 农业面源污染治理2025年农业废弃物处理技术与农村环境保护政策研究
- 第11课 干干家务活 教学设计-三年级下册小学美术同步备课资源包(苏少版)
- 我总忘了说爱你(教学设计)-小学生感恩母爱班会主题
- 第五节 红外测障传感器应用-救援机器人说课稿-2025-2026学年初中信息技术河大音像版2020八年级上册-河大音像版2020
- Unit 4 Bobby's House Lesson4(教学设计)-北师大版(三起)英语四年级上册
- 2025年中国高纯沉淀硫酸钡行业市场分析及投资价值评估前景预测报告
- 节后复工安全培训通讯课件
- 冰雪场馆建设施工方案
- 机械设备维修技术(第5版)(微课版)课件 第18讲 典型零部件的装配1
- 食用菌科普课件模板
- 各种引流管的固定及护理
- 核心高考高频688词汇(高考高频词汇)
- 国开2025年人文英语4写作形考答案
- 足球俱乐部会员权益规定
- AIGC艺术设计 课件全套 第1-8章 艺术设计的新语境:AI的介入 -AIGC艺术设计的思考与展望
- 冀教版(三起)(2024)三年级上册英语Unit 1 Lesson 1 Hello!教案
- 化肥产品生产许可证实施细则 2
评论
0/150
提交评论