veriloghdl答案Word文档下载推荐.docx
《veriloghdl答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《veriloghdl答案Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
2)语句内时延:
这是右边表达式数值计算与左边表达式赋值间的时延。
Sum=#3(A^B)^Cin;
}
这个赋值中的时延意味着首先计算右边表达式的值,等待3个时间单位,然后赋值给Sum。
4.采用数据流描述方式描述图2-4中所示的1位全加器。
moduleFA_Seq(A,B,Cin,Sum,Cout);
inputA,B,Cin;
~
outputSum,Cout;
wireT1,T2,T3,S1;
assignT1=A&
Cin;
assignT2=B&
assignT3=A&
B;
|
assignS1=A^B;
assignSum=S1^Cin;
assignCout=(T1|T2)|T3;
endmodule
4.initial语句与always语句的关键区别是什么
@
1)initial语句:
此语句只执行一次。
2)always语句:
此语句总是循环执行,或者说此语句重复执行。
6.写出产生图2-10所示波形的变量BullsEye的初始化语句。
`timescale1ns/1ns
moduleTest(BullsEye);
outputBullsEye;
regBullsEye;
initial
begin
(
BullsEye=0;
BullsEye=#21;
BullsEye=#10;
BullsEye=#91;
BullsEye=#100;
…
BullsEye=#30;
BullsEye=#51;
end
;
7.采用结构描述方式描写图2-2中所示的2-4译码器。
moduleDecoder2x4(A,B,EN,Z);
inputA,B,EN;
output[0:
3]Z;
】
wireAbar,Bbar;
not
v0(Abar,A),
v1(Bbar,B);
nand
N0(Z[0],Abar,Bbar,EN),
N1(Z[1],Abar,B,EN),
N2(Z[2],A,Bbar,EN),
N3(Z[3],A,B,EN);
、
8.为2.3节中描述的模块Decode2X4编写一个测试验证程序。
moduleTes;
regTA,TB,TEN;
wire[0:
3]TZ;
Decoder2x4DT2x4(TA,TB,TEN,TZ);
$
$monitor($time,"
A=%b,B=%b,EN=%b,Z=%b"
TA,TB,TEN,TZ);
TA=0;
TB=0;
TEN=0;
#5TA=1;
TB=1;
#5TEN=1;
#5TA=0;
]
9.列出你在VerilogHDL模型中使用的两类赋值语句。
连续赋值语句assign,阻塞赋值语句=
10.在顺序过程中何时需要定义标记
顺序过程内有局部声明的变量时,初始化语句中的顺序过程必须标记。
11.使用数据流描述方式编写图2-11所示的异或逻辑的VerilogHDL描述,并使用规定的时延。
moduleXORL(A,B,Z);
inputA,B;
outputZ;
wireAbar,Bbar,Z1,Z2;
assign#1Bbar=~B;
assign#1Abar=~A;
assign#5Z1=A&
Bbar;
assign#5Z2=B&
Abar;
assign#4Z=Z1|Z2;
%
12.找出下面连续赋值语句的错误。
assignReset=#2^WriteBus;
不符合连续赋值语句的语法,应该为:
assign#2Reset=^WriteBus;
第3章Verilog语言要素
1.下列标识符哪些合法,哪些非法
COunT,1_2Many,\**1,Real,\wait,Initial
答:
COunT合法,1_2Many非法,\**1,Real非法,\wait合法,Initial合法
2.系统任务和系统函数的第一个字符标识是什么
3.举例说明文本替换编译指令
`define指令用于文本替换,它很像C语言中的#define指令,如:
`defineMAX_BUS_SIZE32
...
reg[`MAX_BUS_SIZE-1:
0]AddReg;
4.在VerilogHDL中是否有布尔类型
》
没有
5.下列表达式的位模式是什么
7'
o44位八进制数,'
Bx0位二进制数,5'
bx110位二进制数,'
hA0位十六进制数,10'
d2位十进制数,'
hzF位十六进制数
6.赋值后存储在Qpr中的位模式是什么
reg[1:
8*2]Qpr;
Qpr="
ME"
;
变量需要8*2位
7.如果线网类型变量说明后未赋值,其缺省值为多少
z
HDL允许没有显示说明的线网类型。
如果是这样,怎样决定线网类型
在VerilogHDL中,有可能不必声明某种线网类型。
在这样的情况下,缺省线网类型为1位线网。
可以使用`default_nettype编译器指令改变这一隐式线网说明方式。
使用方法如下:
`default_nettypenet_kind
例如,带有下列编译器指令:
`default_nettypewand
:
任何未被说明的网缺省为1位线与网。
9.下面的说明错在哪里
integer[0:
3]Ripple;
应该是integerRipple[0:
3]
10.编写一个系统任务从数据文件“memA.data”中加载32×
64字存储器。
reg[15:
0]RomB[0:
2047];
$readmemb("
"
RomB);
11.写出在编译时覆盖参数值的两种方法。
以使用参数定义语句或通过在模块初始化语句中定义参数值。
第4章表达式
\
1.说明参数GATE_DELAY,参数值为5。
parameterGATE_DELAY=5
2.假定长度为64个字的存储器,每个字8位,编写Verilog代码,按逆序交换存储器的内容。
即将第0个字与第63个字交换,第1个字与第62个字交换,以此类推。
reg[7:
0]mem[63:
0];
integeri=0;
0]temp;
while(i<
32)
temp=mem[i];
mem[i]=mem[63-i];
mem[63-i]=temp;
i=i+1;
3.假定32位总线Address_Bus,编写一个表达式,计算从第11位到底20位的归约与非。
~&
addressBus[20:
11]
·
4.假定一条总线Control_Bus[15:
0],编写赋值语句将总线分为两条总线:
Abus[0:
9]和Bbus[6:
1]。
Abus=ControlBus[9:
Bbus=ControlBus[15:
10];
5.编写一个表达式,执行算术移位,将Qparity中包含的8位有符号数算术移位。
{Qparity[7-i:
0],Qparity[7:
8-i]}用条件操作符,编写赋值语句选择NextState的值。
如果CurrentState的值为RESET,那么NextState的值为GO;
如果CurrentState的值为GO,则NextState的值为BUSY;
如果CurrentState的值为BUSY,则NextState的值为RESET。
NextState=(CurrentState==RESET)Go:
(CurrentState==GoBUSY:
RESET)
7.使用单一连续赋值语句为图2-2所示的2-4解码器电路的行为建模。
【提示:
使用移位操作符、条件操作符和连接操作符。
assignZ=EN{~(A&
B),~(A&
~B),~(~A&
B),~(~A&
~B)}:
4b'
1111;
8.如何从标量变量A、B、C和D中产生总线BusQ[3:
0]如何从两条总线BusA[3:
0]和BusY[20:
15]形成新的总线BusR[10:
1]
BusQ[3:
0]={D,C,B,A}
BusR[10:
1]={BusY[20:
15],BusA[3:
0]}
第5章门电平模型化
1.用基本门描述图5-11显示的电路模型。
编写一个测试验证程序用于测试电路的输出。
使用所有可能的输入值对电路进行测试。
modulecompare(A,B,Q);
。
input[3:
0]A;
0]B;
outputQ;
xor(E0,A[0],B[0]),
(E1,A[1],B[1]),
#
(E2,A[2],B[2]),
(E3,A[3],B[3]);
or(Q,E0,E1,E2,E3);
endmodule
测试:
—
modulecomparetest;
parameterCLK_PERIOD=20;
(A),.B(B));
2.使用基本门描述如图5-12所示的优先编码器电路模型。
当所有输入为0时,输出Valid为0,否则输出为1。
并且为验证优先编码器的模型行为编写测
试验证程序。
modulepriority(Data,Encode,valid);
0]Data;
output[1:
0]Encode;
outputvalid;
not(Data2bar,Data[2]);
and(out1,Data2bar,Data[1]);
or(out2,Data[1],Data[0]),
(Encode[0],Data[3],out1),
(Encode[1],Data[3],Data[2]),
(valid,Data[3],Data[2],out2);
modulepriority_tb;
reg[3:
#100Data[3]=0;
Data[2]=0;
Data[1]=0;
Data[0]=0;
#100Data[3]=1;
priorityinst_priority(.Data(Data));
第6章用户定义的原语
1.组合电路UDP与时序电路UDP如何区别
在组合电路UDP中,表规定了不同的输入组合和相对应的输出值。
没有指定的任意组合输出为x。
在时序电路UDP中,使用1位寄存器描述内部状态。
该寄存器的值是时序电路UDP的输出值。
有时钟作为输入信号。
2.UDP可有一个或多个输出,是否正确
不正确。
UDP只能有一个输出和一个或多个输入。
3.初始语句可用于初始化组合电路UDP吗
不可以。
只有时序电路UDP的状态初始化可以使用带有一条过程赋值语句的初始化语句实现。
4.为图5-12中显示的优先编码器电路编写UDP描述。
使用测试激励验证描述的模型。
ata(data));
5.为T触发器编写UDP描述。
在T触发器中,如果数据输入为0,则输出不变化。
如果数据输入是1,那么输出在每个时钟沿翻转。
假定触发时钟沿是时钟下跳沿,使用测试激励验证所描述的模型。
(Q),.Data(Data),.Clk(Clk));
6.以UDP方式为上跳边沿触发的JK触发器建模。
如果J和K两个输入均为0,则输出不变。
如果J为0,K为1,则输出为0。
如果J是1,K是0,则输出是1。
如果J和K都是1,则输出翻转。
使用测试激励验证描述的模型。
(Q),.Clk(Clk),.J(J),.K(K));
第7章数据流模型化
1.例说明截止时延在连续赋值语句中如何使用
截止时延就是由输入信号的任一状态(1、0或X)转换到高阻状态“Z”输出之间的延时时间。
例如
assign#(4,1,6)dout=din;
“()”中的三个值,4代表上升延时,1代表下降延时,6为截止延时
由图中可知
上升时延为4ns(5~9ns)
-
下降时延为1ns(15~16ns)
截止时延为6ns(18~24ns),即从din=1’bz开始到dout为1’bz的延时
2.当对同一目标有2个或多个赋值形式时,如何决定目标有效值
只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;
如果结果值有变化,新结果就赋给左边的线网。
如果右端在传输给左端之前变化,在这种情况下,应用最新的变化值。
3.写出图5-10所示的奇偶产生电路的数据流模型描述形式。
只允许使用2个赋值语句,并规定上升和下降时延。
!
moduleParity_9_Bit(D,Even,Odd);
input[0:
8]D;
outputEven,Odd;
assign#(20,16)Even=^D;
assign#
(2)Odd=~Even;
整个奇偶产生电路累计的上升时间延时是4组,下降时间延时也是四组,所以,上升时间延时=5*4=20,下降时间延时为4*4=16。
4.使用连续赋值语句,描述图5-12所示的优先编码器电路的行为。
moduleEncoder(Data,Encode,Valid);
outputValid;
assignEncode[0]=Data[3]|(~Data[2]&
Data[1]);
assignEncode[1]=Data[3]|Data[2];
《
assignValid=Data[3]|Data[2]|Data[1]|Data[0];
5.假定:
Tri0[4:
0]Qbus;
assignQbus=Sbus;
assignQbus=Pbus;
如果Pbus和Sbus均为高阻态z,Qbus上的值是什么
5’d0。
无驱动源驱动Qbus,因而为0。
第8章行为建模
语句always语句,哪一种可重复执行
initial语句只执行一次。
initial语句在模拟开始时执行,即在0时刻开始执行。
与initial语句相反,always语句可重复执行。
2.顺序语句块和并行语句块的区别是什么举例说明。
顺序语句块能否出现在并行语句块
中
1)顺序语句块(begin...end):
语句块中的语句按给定次序顺序执行。
^
顺序语句块中的语句按顺序方式执行。
每条语句中的时延值与其前面的语句执行的模拟
时间相关。
一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行。
顺序语
句块的语法如下:
begin
[:
blockid{declarations}]
proceduralstatement(s)
end
例如:
//产生波形:
#2Stream=1;
#5Stream=0;
#3Stream=1;
#4Stream=0;
2)并行语句块(fork...join):
语句块中的语句并行执行。
并行语句块带有定界符fork和join(顺序语句块带有定界符begin和end),并行语句块中的
各语句并行执行。
并行语句块内的各条语句指定的时延值都与语句块开始执行的时间相关。
并行语句块内的所有语句必须在控制转出语句块前完成执行。
并行语句块语法如下:
fork
proceduralstatement(s);
join
/
句块在什么时候需要标识符
需要在语句块中声明寄存器变量时,需要标识符。
带标识符的语句块可被引用;
例如,语句块可使用禁止语句来禁止执行。
此外,语句块标识符提供唯一标识寄存器的一种方式。
但是,要注意所有的寄存器均是静态的,即它们的值在整个模拟运行中不变。
4.在always语句中是否有必要指定时延
没有必要指定时延。
在将Verilog程序进行综合的时候延时的内容不识别,如果需要可以testbench里指定延时。
5.语句内部时延和语句间时延的区别是什么举例说明。
在赋值语句中表达式右端出现的时延是语句内部时延。
通过语句内部时延表达式,右端
的值在赋给左端目标前被延迟。
语句间时延是右端表达式在语句内部时延之前计算,随后进入时延等待,再对左端目标赋值。
'
下例说明了语句间和语句内部时延的不同。
Done=#5'
b1;
塞性赋值和非阻塞性赋值有何区别
阻塞性赋值使用“=”,非阻塞性赋值使用“<
=”。
阻塞性赋值,在其后所有语句执行前执行,即在下一语句执行前该赋值语句完成执行;
非阻塞性赋值执行时,计算右端表达式,右端值被赋于左端目标,并继续执行下一条语句,在当前时间步结束或任意输出被调度时,对左端目标赋值。
非阻塞性赋值对于左边赋值变量的更新操作的优先级要低于阻塞赋值,也低于非阻塞赋值本身等号右边的表达式计算,需要等到当前仿真周期结束时才能被执行。
;
7.casex语句与case语句有何区别
casex是case的派生语句,casex语句将分支条件中所有的x(未知)和z(高阻)值被认为是无关位。
其他情况下casex与case完全相同。
8.能否在always语句中为线网类型(例如wire型线网)赋值
不能,网线类型只能在过程块之外赋值。
9.产生一个在5ns时刻开始、周期为10ns的时钟波形。
always
#5Clk=~Clk;
//产生时钟周期为10的波形
10.用一个initial语句和1个forever循环语句替代下述always语句。
always
@(ExpectedorObserved)
if(Expected!
==Observed)begin
$display("
MISMATCH:
Expected=%b,Observed=%b"
Expected,Observed);
$stop;
initial
forever
==Observed)
11.按如下条件,两个always语句中NextStateA和NextStateB上的值是多少:
ClockP在5ns时有1个正沿;
CurrentState在时钟边沿前值为5,并且在时钟沿3ns后改变为7
@(posedgeClockP)
*
#7NextState