1.(不定项)在verilog设计时,我们应当避免锁存器(Latch) 的产生,下列代码中,会被综合为锁存器的有
-
``` module modulea( input data, input en , output reg q) ; always @(*) begin if (en) q = data ; end endmodule ```
-
``` module moduleb( input data1, input data2, input en , output reg q1 , output reg q2 ) ; always @(*) begin if (en) q1 = data1 ; else q2 = data2 ; end endmodule ```
-
``` module modulec( input data1, input data2, input [1:0] sel , output reg q ) ; always @(*) begin case(sel) 2'b00: q = data1 ; 2'b01: q = data2 ; endcase end endmodule ```
-
``` module moduled( rd, rst, outdata ); input rd; input rst; output reg outdata; always@(rst) if(!rst) outdata = 1'b0; else outdata = rd; endmodule ```
官方解析:A 中 if 语句中缺少 else 结构,系统默认 else 的分支下寄存器 q 的值保持不变,即具有存储数据的功能,所以寄存器 q 会被综合成 latch 结构。
B 中的条件语句中有多条赋值语句,每个分支条件下赋值语句的不完整(即假设en有效,仅仅赋值了q1,这时q2就会所存,en无效情况也一样;低四个则是敏感列表不完整,仅仅rst变化时才会赋值,其他变量如rd变化就会被忽略,造成锁存。),这也会产生 latch。
C 中 case 选项列表不全且没有加 default 关键字,也会产生 Latch。
D 中组合逻辑中 always@() 块内敏感列表没有列全(有rst 和 rd两个),该触发的时候没有触发,那么相关寄存器还是会保存之前的输出结果,因而会生成锁存器。直接用 always@(*) 即可消除 latch
正确答案:ABCD
2.观察下面的选项,选出正确的选项。
A.parameter语句能够在延时的格式说明块中出现
B.由specparam语句进行定义的参数只能是延时参数
C.由parameter语句定义的延时参数只能在延时说明块内使用
官方解析:
specparam语句只能在延时的格式说明块中出现,而parameter语句则不能够在延时的格式说明块中出现。所以A选项是错误的。
由specparam语句定义的延时参数只能在延时说明块内使用,而由parameter语句定义的参数则可以在模块内的任何位置说明。所以C选项是错误的。
正确答案:B
3.请问{1,0}与下面哪个值相等?
A.2'b01
B.2'b10
C.64'h0000000000000002
D.64'h0000000100000000
官方解析:位拼接运算符必须指明位数,若不指明则隐含着为32位的二进制数(即整数)
正确答案:D
4.关于Verilog的task任务说法错误的是()?
A.任务内可包含延时语句、敏感事件控制语句等事件控制语句
B.可以没有或可以有一个或多个输入、输出和双向端口
C.没有返回值
D.任务内不能出现 always 语句,但可出现initial语句
任务内不能出现过程块语句,包括initial语句。
正确答案:D
5.乘法器通常有四种实现方法,并行乘法器,移位相加乘法器,查找表乘法器,加法树乘法器,下列关于乘法器描述错误的是()
A.并行乘法器是在verilog直接用*表示,这种乘法器要用综合工具得到乘法结果
B.并行乘法器耗用资源多
C.移位相加乘法器是从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1(width-1))位后,与上一次和进行相加,若为0,则乘数左移i位后,以0相加。直到被乘数的最高位
D.移位相加乘法器实际由移位和加法运算完成,占用资源少,串行并行速度都快
官方解析:
移位相加法实现乘法的优点是占用的资源较少;缺点是速度比较慢,一个结果的输出需要花费多个时钟周期,在高位宽乘法运算中极为明显
正确答案:D
6.编码方式描述错误的是()
A.格雷码是其循环和单步特性消除了随机取数时出现重大错误的可能,是一种可靠性编码,是一种错误最小化的编码方式
B.独热编码又称一位有效编码,状态译码简单,但不易于修改,增加状态或改变状态转换条件都影响状态机的其它部分
C.使用格雷编码,则相邻状态转换时只有一个状态位发生翻转,这样不仅能消除状态转换时由多条状态信号线的传输延迟所造成的毛刺
D.独热码任何状态只有1bit为1,其余皆为0,编码密度低
官方解析:
使用较多的触发器,状态译码简单,可减少组合逻辑且速度较快,这种编码方式还易于修改,因为任何状态只有1bit,所以在增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。
正确答案:B
7.观察下面的各个选项,找出其中正确的选项。
A.任务会有返回值
B.函数至少有一个输入变量
C.函数可以定义自己的仿真时间单位
D.函数可以启动任务
官方解析:
函数返回一个值,而任务则不返回值。所以A是不正确的。
函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。所以B正确。
函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。所以C是不正确的。
函数不能启动任务,而任务能够启动其他任务和函数。所以D是不正确的。
正确答案:B
8.观察下面的代码,说明在仿真时刻为()时,寄存器set被赋值为0;在仿真时刻为()时,寄存器set被赋值为1。
`timescale 10ns/1ns
module test;
reg set;
parameter d=1.55;
initial begin
#d set=0;
#d set=1;
end
endmodule
A.15.5,31
B.16,32
C.1.55,3.1
D.1.6,3.2
官方解析:`timescale命令定义了test模块的时间单位是10ns,时间精度是1ns。因为,在test模块中,所有的时间值应为10ns的整数倍,且以1ns为时间精度。这样经过取整操作,存在参数d中的延迟时间实际是16ns,这意味着在仿真时刻为16ns时寄存器set被赋值0;在仿真时刻为32ns时寄存器set被赋值1。
正确答案:B
9.下面哪个不是 不可综合的verilog语句
A.events
B.force 和release
C.#10
D.instantitation
官方解析:instantitation 实例化 可综合
以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
event在同步test bench时更有用,不能综合。
不支持force和release的综合。
正确答案:D
10.观察下面的代码,选出正确的输出结果。
module printval;
reg [11:0] rl;
initial begin
rl=10;
$display("rl=%0d=%0h",rl,rl);
end
endmodule
A.rl=10=00a
B.rl=10=0a
C.rl=10=a
D.rl=10=000a
官方解析:在$display中,输出列表中数据的显示宽度是自动按照输出格式进行调整的。这样在显示输出数据时,在经过格式转换以后,总是用表达式的最大可能值所占的位数来显示表达式的当前值。在用十进制数格式输出时,输出结果前面的0值用空格带代替。对于其他进制,输出结果前面的0依然显示出来。可以通过在%和表示进制的字符中间插入一个0自动调整显示输出数据宽度的方式。
正确答案:C
11.下列关于Verilog动态位宽截取的说法错误的是( )
A.vect_testa[4+:3]表示,截取宽度为3,升序截取
B.vect[base+:width]或[base-:width]中,width可变,base必须为常量
C.Verilog的数据截取可采用[ ]或者{ }
D.vect_testb[4-:3] = vect_testb [6:4]
官方解析:
Verilog动态固定宽度截取,vect[base±:width],base表示起始位,width表示截取宽度,base可变,width必须为常量。
截取使用方括号[],拼接使用大括号{}。
vect[base+:width]表示升序截取,vect[base-:width]表示降序截取。
选项D,vect_testb[4-:3] = vect_testb [4:2]
正确答案:BCD