牛客网选择错题总结--Verilog

本文详细讨论了Verilog语言中的不可综合语句,如events,force和release,并介绍了综合工具对不同结构的支持情况。同时,文章涵盖了CPLD和FPGA的区别,时序违例的解决方案,以及Verilog中的随机数生成、算术运算、系统任务等功能。此外,还涉及到了Verilog设计中的错误处理、乘法器实现方法和编码方式等核心概念。
摘要由CSDN通过智能技术生成

5.下面哪个不是 不可综合的verilog语句

A.events

B.force 和release

C.#10

D.instantitation

正确答案:D 你的答案:C

官方解析:

  1. instantitation 实例化 可综合
  2. 以#开头的延时不可综合成硬件电路延时,综合工具会忽略所有延时代码,但不会报错。
  3. event在同步test bench时更有用,不能综合。
  4. 不支持force和release的综合。

评论解答:

所有综合工具都支持的结构: alwaysassignbeginendcasewiretriaupply0supply1regintegerdefaultforfunctionandnandornorxorxnorbufnotbufif0bufif1notif0notif1ifinoutinputinstantitationmodulenegedgeposedgeoperatorsoutputparameter generate

所有综合工具都不支持的结构: timedefparam$finishforkjoininitialdelaysUDPwait

有些工具支持有些工具不支持的结构: casexcasezwandtriandwortriorrealdisableforeverarraysmemoriesrepeattaskwhile

新增:

forever                循环次数不确定的循环语句

initial                   只能在test bench中使用,不能综合

fork join               不可综合,可以使用非块语句达到同样的效果。


4.任务task内不能出现过程块语句,包括always和initial语句。

任务不能出现 always 语句,但可以包含其他时序控制,如延时语句

(说可以包含任何时序语句是错的)

任务可以作为一条单独的语句出现语句块中


2.下列哪一个选项不属于Verilog系统函数和任务( )

A $realtime

B $readmemb

C $setup

D $time

正确答案:C 你的答案:D

官方解析:

$time用来查看当前仿真时刻,返回一个64bit的整数来表示的当前仿真时刻;

$realtime和$time的作用相同,$realtime但是返回的时间数字是一个实型数;

$readmemb,用来从文件中读取数据到存储器中;

选项C不是verilog定义的系统函数和任务。


3.CPLD与FPGA都是通用可编程逻辑器件。在下面关于CPLD与FPGA的选项中,正确的是()

A CPLD的集成度和复杂度均高于FPGA

B FPGA工艺多为EEPROM等工艺

C CPLD多为SRAM、flash工艺

D FPGA相对CPLD成本高

正确答案:D

官方解析:

FPGA的集成度和复杂度均高于GPLD,所以FPGA可实现复杂逻辑电路设计。所以A选项是错误的。

FPGA工艺多为SRAM、flash等工艺,掉电后内信息消失,所以该类型需外配存储器,而CPLD工艺多为EEPROM等工艺,掉电后信息不消失,所以不用外配存储器。所以B选项和C选项都是错误的。


3.在Verilog的算数运算中,11%-3的结果为(),-10%3的结果为()

A 2,1

B 2,-1

C -2,1

D -2,-1

正确答案:B

官方解析:

在进行取模运算时,结果值的符号位采用模运算式里第一个操作数的符号位。

备注:%是取模运算,优先级大于+和-


3.input、inout 类型不能声明为 reg 数据类型,因为 reg 类型是用于保存数值的,而输入端口只能反映与其相连的外部信号的变化,不能保存这些信号的值。

备注:inout 只能是wire型!!!(又能做输入,又能做输出)


5.用户定义的原语是从英语User Defined Primitives直接翻译过来的,简称UDP。利用UDP用户可以定义自己设计的基本逻辑元件的功能。下面选项中,关于UDP正确的是()

A UDP可以有多个输入端

B UDP可以有多个输出端

C UDP的真值表中,可以出现高阻值状态Z。

D 输入端和输出端都可以被定义为寄存器类型变量

正确答案:A 你的答案:C

官方解析:

UDP可以有多个输入端,最多允许有10个输入端。A选项正确。

UDP只能有一个输出端,而且必定是端口说明列表的第一项。B选项错误。

在UDP的真值表项中,只允许出现0,1,X的三种逻辑值,高阻值状态Z是不允许出现的。所以C选项是错误的。

只有输出端才可以被定义为寄存器类型变量。所以D选项是错误的。


2.$display函数和$write函数的作用都是用来输出信息。

$display自动地在输出后进行换行,$write则不是这样。

$display命令的执行是安排在活动事件队列中,但排在非阻赋值赋值数据更新事件之前

$strobe命令的执行是排在非阻塞赋值数据更新事件之后。(等所有赋值结束后打印)

$display适合用来显示阻塞语句的赋值,$strobe适合用来显示非阻塞语句的赋值

initial begin
    $dumpfile("dump.vcd");
    $dumpvars;
    a = 4'd2;
    b = 4'd3;
    c = 4'd4;
    #(PERIOD*15) $stop;
  end
  
  always @(posedge clk ) begin
    b <= c;
    a <= b;
    $display("display a = %d", a);
    $strobe("strobe a = %d", a);
  end

输出如下:

# KERNEL: display a =  2
# KERNEL: strobe a =  3
# KERNEL: display a =  3
# KERNEL: strobe a =  4

3. verilog设计中,当发生违例时,下列解决方式错误的是()

A 发生hold违例,牺牲setup保持hold

B 发生setup违例,修改设计

C 发生hold违例,添加延迟模块(buf),增加数据的延迟

D 发生setup违例,提升工作频率

正确答案:D 你的答案:A

官方解析:

要降低工作频率,提高时钟周期,才可以解决,一般不推荐

评论解答:

发生setup违例,说明数据路径延时过大,可以修改设计,缩短数据路径延时,所以B正确;或者降低时钟频率,即增大时钟周期,D错误。

发生hold违例,说明数据保持稳定时间不够,可以通过添加延迟模块来增加数据延迟,C正确。

当同时发生setup和hold违例时,由于hold只与寄存器延时Tcq与组合逻辑延时Tcombo相关,而setup还与时钟周期T相关,所以可以选择先修复setup违例,hold还可以通过降频来解决,只是影响电路性能;若先选择修复hold违例,那么setup将无解。


$fmonitor、$fstrobe、$fdisplay、$fwrite都是用来写文件的。

$dumpfile的作用是选择VCD文件的名称。


2.

观察下面的代码,说明下面的代码会产生()区间的随机数。

reg [23:0] rand;

rand = {$random} %60;

A -59~59

B -59~60

C 0~59

D 0~60

正确答案:C 你的答案:A

官方解析:

$random的一般用法为:

1、$random %b,其中b>0。它给出了一个范围在(-b+1):(b-1)中的随机数。

2、{$random} %b,其中b>0。它给出了一个范围在0:(b-1)中的随机数。

 备注:产生一个在min, max之间随机数的例子:

  reg[23:0] rand;

  rand = min+{$random}%(max-min+1)


4.请问{1,0}与下面哪个值相等?

A 2'b01

B 2'b10

C 64'h0000000000000002

D 64'h0000000100000000

正确答案:D 你的答案:B

官方解析:位拼接运算符必须指明位数,若不指明则隐含着为32位的二进制数(即整数)


4.代码$display("%h",14'bx0_1010)的输出结果是()?

A xxxa

B xxXa

C XXXa

D XXxa

正确答案:B 你的答案:未作答

官方解析:

如果输出列表中表达式的值包含有不确定的值或者是高阻值,且在输出格式为十六进制的情况下,其结果输出遵循以下原则:

①每四位二进制数为一组代表一位十六进制数;

②如果表达式值相对应的某进制数的部分位为不定值,则该位进制数输出结果为大写的X

③如果表达式值相对应的某进制数的所有位均为不定值,则该位进制数输出结果为小写的x


5.下面有A、B两条语句。

A语句为if(flag==1'bx) $display("Yes");

B语句为if(flag===1'bx) $display("Yes");

当flag=1'bx时,判断A、B语句是否执行?

A A语句执行,B语句也执行

B A语句执行,B语句不执行

C A语句不执行,B语句执行

D A语句不执行,B语句也不执行

正确答案:C 你的答案:A

官方解析:

下面是===和==的真值表。

===01xz
01000
10100
x0010
z0001
==01xz
010xx
101xx
xxxxx
zxxxx

备注:==表示逻辑相等,左右两边均为不定态时不能判断其逻辑上是相等的。

           ===表示位全等,x与其本身是相等的。


4. 观察下面的选项,选出正确的选项。

A parameter语句能够在延时的格式说明块中出现

B 由specparam语句进行定义的参数只能是延时参数

C 由parameter语句定义的延时参数只能在延时说明块内使用

正确答案:B 你的答案:未作答

官方解析:

specparam语句只能在延时的格式说明块中出现,而parameter语句则不能够在延时的格式说明块中出现。所以A选项是错误的。

由specparam语句定义的延时参数只能在延时说明块内使用,而由parameter语句定义的参数则可以在模块内的任何位置说明。所以C选项是错误的。


2. Verilog中,关于case、casez、casex语句说法错误的是( )

A casez语句用来处理不考虑高阻值z的比较过程

B casex语句用来处理不考虑高阻值z和不定态x的比较过程

C case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配

D case、casez是可综合的,casex是不可综合的

正确答案:D 你的答案:A

官方解析:

case、casez、casex均是可综合的。

case, casez, casex 的真值表如下:

可以看出,casez语句用来处理不考虑高阻值z的比较过程;casex语句用来处理不考虑高阻值z和不定态x的比较过程;对于case语句,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。


4.乘法器通常有四种实现方法,并行乘法器,移位相加乘法器,查找表乘法器,加法树乘法器,下列关于乘法器描述错误的是()

A 并行乘法器是在verilog直接用*表示,这种乘法器要用综合工具得到乘法结果

B 并行乘法器耗用资源多

C 移位相加乘法器是从被乘数的最低位开始判断,若为1,则乘数左移i(i=0,1(width-1))位后,与上一次和进行相加,若为0,则乘数左移i位后,以0相加。直到被乘数的最高位

D 移位相加乘法器实际由移位和加法运算完成,占用资源少,串行并行速度都快

正确答案:D 你的答案:A

官方解析:

移位相加法实现乘法的优点是占用的资源较少;缺点是速度比较慢,一个结果的输出需要花费多个时钟周期,在高位宽乘法运算中极为明显


熟练掌握二进制和十进制之间的转换!

将十进制数13.613转换成二进制数,要求装换误差小于1%

解析:

首先根据转换误差确定二进制小数的位数,然后采用基数乘除法转换。

整数部分采用基数除法,反复初2,则13/2=6,余1  6/2=3,余0  3/2=1,余1,所以(12)D =(1101)B 

小数部分采用基数除法,先确定小数的位数。2-m ≤1%,可求出m≥2/lg2=6.64,m取7,则

0.613*2=1.226 取整数1,    0.226*2=0.452 取整数0, 0.452*2=0.904 取整数0,

0.904*2=1.808 取整数1, 0.808*2=1.616 取整数1, 0.616*2=1.232 取整数1,

0.232*2=0.464 取整数0, 0.464*2=0.928 取整数0

最后的小数大于0.5,根据四舍五入,最后应该取1,因为取七位,所以从第八位开始取,10011101,

0.0011B =1*2-1 +1*2-4+1*2-5 +1*2-6+1*2-8 = 0.61328125 误差0.61328125-0.613=0.00028125≈0.03% 满足要求。


3.观察下面的代码,选出正确的输出结果。

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

正确答案:C 你的答案:A

官方解析:在$display中,输出列表中数据的显示宽度是自动按照输出格式进行调整的。这样在显示输出数据时,在经过格式转换以后,总是用表达式的最大可能值所占的位数来显示表达式的当前值。在用十进制数格式输出时,输出结果前面的0值用空格带代替。对于其他进制,输出结果前面的0依然显示出来。可以通过在%和表示进制的字符中间插入一个0自动调整显示输出数据宽度的方式。

备注:%0表示以最小位宽显示


4.

系统任务$finish的作用是退出仿真器,返回主操作系统,也就是结束仿真过程。任务$finish可以带参数,根据参数的值输出不同的特征信息。如果不带参数,默认$finish的参数值为1。请问当$finish的参数值为2时,系统输出的特征信息是()

A 不输出任何信息

B 输出当前仿真时刻和位置

C 输出当前仿真时刻、位置和在仿真过程中所用memory及CPU时间的统计。

正确答案:C 你的答案:B

官方解析:

当参数值为0时,特征信息为:不输出任何信息

当参数值为1时,特征信息为:输出当前仿真时刻和位置

当参数值为2时,特征信息为:输出当前仿真时刻、位置和在仿真过程中所用memory及CPU时间的统计。


5.

下列关于主从D触发器工作原理描述错误的是()

A 当D=0时,Q‘非=1,Q’=0

B 当D=0时,TG1导通,TG2断开,输入信号D送入主锁存器,从锁存器维持在原来的状态不变

C 当C从0跳变到1后,Q’非保持不变

D 当C从0跳变到1时,主锁存和从锁存器都开始工作,传输信号

正确答案:D 你的答案:C

官方解析:

主锁存器保持,从锁存器接收来自主锁存器的信号

备注:C是cp时钟信号,影响TG的导通断开


算术移位“>>>”:

对于有符号数来说:

若符号位为1,使用>>>,高位补1;

若符号位为0,使用>>>,高位补0;

对于无符号数来说,无论最高位是什么,使用>>>,高位都补0。


优先级的划分如下,从前到后优先级逐渐降低: 

1.算数运算符: ! ~

                          * / %

                          + - 

2.移位运算符: << >> 

3.关系运算符: <= < > >= 

4.等式运算符: == != === !==

5.缩减运算符: & | ^ ^~ 

6.逻辑运算符:&& ||,注意不包括逻辑非! 

7.条件运算符: ? : 

8.拼接运算符: {}


2.下列关于查找表乘法器描述错误的是()

A 查找表乘法器原理是先将乘法的所有可能结果存储起来,然后将两个相乘的数据组合起来作为“地址”找到相应的结果

B 4位查找表乘法器只需要2个周期,在第1个上升沿装载一个数据,第2个上升沿调用查找表乘法器完成2位数相乘,第3个上升沿输出第一个结果,因此从输入到输出延迟2个时钟周期

C 查找表乘法器因为采用查找的方式读取存储器,所以速度很快,面积也小

D 2位查找表乘法器计算只需要一个时钟周期

正确答案:C 你的答案:D

官方解析:该方式速度很快,只取决于读取存储器的速度,但是预存结果要占用较多资源,因此是面积换取速度思想的体现。


3.观察下面的代码,说明在仿真时刻为()时,寄存器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

正确答案:B 你的答案:C

官方解析:`timescale命令定义了test模块的时间单位是10ns,时间精度是1ns。因为,在test模块中,所有的时间值应为10ns的整数倍,且以1ns为时间精度。这样经过取整操作,存在参数d中的延迟时间实际是16ns,这意味着在仿真时刻为16ns时寄存器set被赋值0;在仿真时刻为32ns时寄存器set被赋值1。


4.

上面是对一个同步复位,同步置数,clk上升沿计数,模为60的bcd码加法器,运行下面的仿真后,答案错误的是()
always #10 clk=~clk;
initial begin
clk=0;load=0;cin=0;rst=1;data=8'h50;
#20 rst=1;
#20 rst=0;load=1;
#20 rst=0;load=0;
#20 rst=0;load=0;cin=1;
#220
$finish;
end
 

A 在第40个时钟单位时,Qo=00

B 在第60个时钟单位时候,Qo=50

C 在第140个时钟单位时候,Qo=53

D 在第255个时钟单位时候,Co=0

正确答案:D 你的答案:C

官方解析:在第80个时钟单位时,Cin等于1时候,计数器开始计数,在90的时钟上升沿时开始变化,此后每20个时钟单位加1,当Qo等于59时,20*8=160+90=250产生进位,所以在255时钟时候Co等于1


3.编码方式描述错误的是()

A 格雷码是其循环和单步特性消除了随机取数时出现重大错误的可能,是一种可靠性编码,是一种错误最小化的编码方式

B 独热编码又称一位有效编码,状态译码简单,但不易于修改,增加状态或改变状态转换条件都影响状态机的其它部分

C 使用格雷编码,则相邻状态转换时只有一个状态位发生翻转,这样不仅能消除状态转换时由多条状态信号线的传输延迟所造成的毛刺

D 独热码任何状态只有1bit为1,其余皆为0,编码密度低

正确答案:B 你的答案:A

官方解析:

使用较多的触发器,状态译码简单,可减少组合逻辑且速度较快,这种编码方式还易于修改,因为任何状态只有1bit,所以在增加状态或改变状态转换条件都可以在不影响状态机的其它部分的情况下很方便地实现。


4.下列关于静态,动态时序模拟的优缺点说法错误的是()

A 静态时序分析是提取出整个电路存在的所有时序路径, 计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足时序要求

B 静态时序分析可以对芯片设计进行全面的时序验证和功能验证,验证每一条路径,发现时序的重大问题,比如建立时间和保持时间冲突,slow path以及过大的时钟偏移

C 动态时序模拟就是仿真,自己可能写不出完备的测试向量

D 动态时序模拟能在验证功能的同时验证时序

正确答案:B 你的答案:D

官方解析:静态时序分析不能进行功能验证


5.下列关于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]

正确答案:BCD 你的答案:D

官方解析:

Verilog动态固定宽度截取,vect[base±:width],base表示起始位,width表示截取宽度,base可变,width必须为常量。

截取使用方括号[],拼接使用大括号{}。

vect[base+:width]表示升序截取,vect[base-:width]表示降序截取。

选项D,vect_testb[4-:3] = vect_testb [4:2]


1.事件A分别在10,20,30发生,而B一直保持在X状态,问在50时Count的值是()。

    reg [7:0] Count;

    initial begin

        Count=0;

    end

    always begin

        @(A) Count = Count +1;

        @(B) Count = Count +1;

    end

A 1

B 3

C 0

D 不确定

正确答案:A 你的答案:D

官方解析:这是因为当A第一次发生时,Count的值由0变1,然后时间控制@(B)阻挡了进程。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值