Verilog数字系统设计思考题(持续更新)

1.什么是信号处理电路?它通常由哪两大部分组成?

答:信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应要求的电路。它通常有高速数据通道接口和高速算法电路两大部分组成。

2.为什么要设计专用的信号处理电路?

答:因为有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用处理器也无法在规定的时间内完成必要的运算。

通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过程序编译后生成的机器码指令加载到存储器中,然后在微处理器芯片控制下,按时钟的节拍,逐条取出指令分析指令和执行指令,直到程序的结束。

微处理器芯片中的内部总线和运算部件也是为通用目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性也不可能为某一特殊的算法来设计一系列的专用的运算电路而且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因而其算法速度也受到限制,所以要设计专用的信号处理电路。

3.什么是实时处理系统?

答:实时处理系统是具有实时响应的处理系统。

4.为什么要用硬件描述语言来设计复杂的算法逻辑电路?

答:因为现代复杂数字逻辑系统的设计都是借助于EDA(电子设计自动化Electronic Design Automation)工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。

5.能不能完全用C语言来代替硬件描述语言进行算法逻辑电路的设计?

答:不能,因为基础算法的描述和验证通常用C语言来做。如果要设计一个专用的电路来进行这种对速度有要求的实时数据处理,除了以上C语言外,还须编写硬件描述语言程序进行仿真以便从电路结构上保证算法能在规定的时间内完成,并能通过与前端和后端的设备接口正确无误地交换数据。

6.为什么在算法逻辑电路的设计中需要用C语言和硬件描述语言配合使用来提高设计效率?

答:首先C语言很灵活,查错功能强,还可以通过PLI编写自己的系统任务,并直接与硬件仿真器结合使用。C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比Verilog HDL更完整,此外,C语言有可靠地编译环境,语法完备,缺陷较少,应用于许多的领域。比较起来,Verilog 语言只是针对硬件描述的,在别处使用并不方便。而用Verilog的仿真,综合,查错等大部分软件都是商业软件,与C语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷。所以只有在C语言的配合使用下,Verilog才能更好地发挥作用。C语言与VerilogHDL语言相辅相成,互相配合使用。这就是即利用C语言的完整性又要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的硬件电路系统。

7.什么是硬件描述语言?它的主要作用是什么?

硬件描述语言是一种用形式化方式来描述数字电路和系统的语言。它的主要作用是:数字电路系统的设计者利用这种语言可以从上层到下层(从抽象到具体)逐步描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。

8.目前世界上符合IEEE标准的硬件描述语言有哪两种?它们各有什么特点?

符合IEEE标准的硬件描述语言是VerilogHDL和VHDL两种。

它们的共同特点是:能够形式化地抽象表示电路的行为和结构;支持逻辑设计中层次与范围的描述;可借用高级语言的精巧结构来简化电路行为的描述;具有电路仿真与验证机制以保证设计的正确性;支持电路描述由高层到低层的综合转换硬件描述与实现工艺无关;便于文档管理;易于理解和设计重用。

不同点: VerilogHDL是一种非常容易掌握的硬件描述语言,而VHDL掌握起来就比较困难。

9.什么情况下需要采用硬件描述语言的设计方法?

在对逻辑电路及系统的设计的时间要求很短的情况下需要采用硬件描述语言的设计方法。

10.采用硬件描述语言设计方法的优点是什么?有什么缺点?

优点是:与工艺无关性。这使得工程师在功能设计,逻辑验证阶段,可以不必过多考虑门级及工艺实现的具体细节,只需要利用系统设计时对芯片的要求,施加不同的约束条件,即可设计出实际电路。

缺点是:需要相应的EDA工具,而EDA工具的稳定性需要进一步的在工程中提升。

11.简单叙述一下利用EDA工具并采用硬件描述语言的设计方法和流程?

采用自顶向下的设计方法:从系统级开始把系统划分为基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接用EDA元件库中的基本元件来实现为止。

其基本流程主要由两大主要功能部分组成::①设计开发即从编写设计文件→综合到布局布线→电路生成这样一系列步骤。②设计验证也就是进行各种仿真的一系列步骤,如果在仿真过程中发现问题就返回设计输入进行修改。

12.用硬件描述语言设计的数字系统需要经过哪些步骤才能与具体的电路相对应?

编写设计文件;功能仿真;优化布局布线;布线后门级仿真

13.为什么说用硬件描述语言设计的数字逻辑系统下具有很大的灵活性并可以映射到任何工艺的电路上?

硬件描述语言的设计具有与工艺无关性。这使得工程师在功能设计,逻辑验证阶段,可以不必过多考虑门级及工艺实现的具体细节,只需要利用系统设计时对芯片的要求,施加不同的约束条件,即可设计出实际电路。

14.软核是什么?虚拟器件是什么?它们的作用是什么?

把功能经过验证的,可综合的,实现后电路结构总门数在5000门以上的Verilog HDL模型称为软核。而把由软核构成的器件称为虚拟器件。作用:大大缩短设计周期,加快复杂电路的设计。

15.集成电路行业中IP的含义是什么?固核是什么?硬核是什么?与软核相比它们各有什么特点?各适合于什么场合?

在集成电路行业中IP是知识产权( Itellectual Property)的含义。

把在某一现场可编程门阵列器件(FPGA)上实现的经验验证正确的,总门数在5000门以上的电路结构编码文件称为固核。

把在某一专用集成电路(ASCI)工艺的器件上实现的经验证正确的,总门数在5000门以上的门电路结构版图掩膜称为硬核。

在工具实现手段和工艺技术尚未确定的逻辑设计阶段,IP 核具有很大的灵活性,很容易借助EDA工具与其他外部逻辑结合为一体。相比之下固核和硬核与其他外部逻辑结合为一体的灵活性要差很多。

16.System Verilog与Verilog有什么关系?适合于何种设计?

System Verilog是Verilog语言的拓展和延伸。Verilog适合系统级,算法级,寄存器级,逻辑级,门级,电路开关级设计。而System Verilog更适合于可重用的可综合IP和可重用的验证用IP设计,以及特大型基于IP的系统级设计和验证。

17.Verilog语言有什么作用?

可描述顺序执行和并行执行的程序结构
用延迟表达式或事件表达式来明确地控制过程的启动时间
通过命名的事件来触发其他过程里的激活行为或停止行为
提供了条件如if-else, case 等循环程序结构
提供了可带参数且非零延续时间的任务程序结构
提供了可定义新的操作符的函数结构
提供了用于建立表达式的算术运算符,逻辑运算符,位运算符
Verilog HDL语言作为一种结构化的语言非常适用于门级和开关级的模型设计
提供了一套完整的表示组合逻辑的基本元件的原话
提供了双向通路和电阻器件的原话
可建立MOS器件的电荷分享和电荷衰减动态模型
VerilogHDL的构造性语句可以精确地建立信号的模型

18.为什么说可以用Verilog构成非常复杂的电路结构?

答案同上

19.为什么可以用比较抽象的描述来设计具体的电路结构?

因为有可以用比较抽象描述设计电路结构的语言,而这种语言是适合数字系统设计的语言。

20.是否任意抽象的符合语法的Verilog 模块都可以通过综合工具转变为电路结构?

不能。要符合语法,还符合基本规则的Verilog模块才可以通过综合工具转变为电路结构。

21.什么叫综合?

通过综合工具把行为级描述的模块通过逻辑网表自动转化为门级形式的模块叫综合,这个过程由综合器完成。

22.综合是由什么工具来完成的?

用综合器、EDA工具来完成综合。

23.通过综合产生的是什么?产生的结果有什么用处?

产生的是由与门,或门和非门组成的加法器,比较器等组合逻辑。产生的模块很容易与某种工艺的基本元件逐一对应起来,再通过布局布线工具自动地转变为某种工具工艺的电路布线结构。

24.仿真是什么?为什么要进行仿真?

仿真是对电路模块进行动态的全面测试。通过观测被测试模块的输出信号是否符合要求可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。

25.仿真可以在几层面上进行?每个层面的仿真有什么意义?

分别为:前仿真,逻辑网表仿真,门级仿真和布线后仿真;

前仿真,逻辑网表仿真,门级仿真可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。

布线后仿真:分析设计的电路模块的运行是否正常。

26.如何产生连续的周期性测试时钟?

用always语句或者forever语句来产生连续的周期性测试模块。

27.如果不用initial块,能否产生测试时钟?

不能,没有initial块,就不知道时钟信号的初始值。

28.always块与initial 块有什么不同?

Initial块只执行一次,而always块执行无数次。

29.模块由几个部分组成?

由描述接口和描述逻辑功能两部分组成。具体可以参考模块讲解

30.端口分为几种?

三种:输出口 output,输入口 input,输入/输出口 inout

31.为什么端口要说明信号的位宽?

因为如果不说明信号的位宽可能会在信号发生改变时发生错误,不容易看出接收到的信号的数据宽度,就很难进行数据的处理。

32.能否说模块相当于电路图中的功能模块,端口相当于功能模块的引脚?

可以那样说,每个模块都有特定的功能,而功能的实现就必须依靠具体的电路得以实现,端口是信号传递的通道,可以说是功能模块的引脚。

33.模块中的功能描述可以由哪几类语句或语句块组成?它们出现的顺序会不会影响功能的描述?

用assign语句声明,用实例元件,用always块。它们出现的顺序不会影响到功能的描述。

34.这几类描述中哪一种直接与电路结构有关?

用实例元件直接与电路结构有关。

35.最基本的Verilog变量有哪几种类型?

wire型、reg 型、memory型

36.reg型和wire型变量的差别是什么?

reg型变量是寄存器型变量,wire 型变量是连线型变量。两者根本性的差别在于reg型变量有个寄存器来存放变量,这个值只有变量发生改变时才会改变否则保证原来的值不变,wire型变量的值不是确定的值。

37.由连续赋值语句(assign)赋值的变量能否是reg类型的?

可以是reg类型的变量。

38.在always模块中被赋值的变量能否是wire类型的?如果不能是wire类型,那么必须是什么类型的?它们表示的一定是实际的寄存器吗?

不能。必须是reg类型的变量,它们表示不一定是实际的寄存器。

39.参数类型的变量有什么用处?

参数类型的变量的好处是可以提高程序的可读性和可维护性。

40.Verilog语法规定的参数传递和重新定义功能有什么直接的应用价值?

可以用于定义延迟时间和变量宽度

41.逻辑比较运算符小于等于“<=” 和非阻塞赋值大于等于“<=”的表示是完全一样的,为什么Verilog在语句解释和编译时不会搞错?

因为逻辑比较时“<=”两边是两个操作数,此时“<=”是双目运算符,而在非阻塞赋值时“<=”的右边是操作数,此时“<=”单目运算符。

42.是否可以说实例引用(例化)的描述实际上就是严格意义上的电路结构描述?

不能,实例引用的描述是在门级电路上加以描述的,和严格意义上的电路结构描述还是有点差距的。

43.逻辑运算符与按位逻辑运算符有什么不同,它们各在什么场合使用?

用逻辑运算符运算时是两个操作数进行逻辑运算,而按位逻辑运算符运算时是两个操作数对应的每一位进行逻辑运算。逻辑运算符多用于条件的判断,按位逻辑运算符用于信号的运算和检测。

44.指出两种逻辑等式运算符的不同点

全等( = = = )要求两个比较数完全一样,无论高阻还是未知,只要每位完全相同即可

等于(==)只有在两个操作数每位都已知即1或0,在这种前提下两个操作数每位相同结果才为真,如果不是在这个前提那么其结果始终为x

45.拼接符的作用是什么?为什么说合理地使用拼接符可以提高程序的可读性和可维护性?拼接符表示的操作其物理意义是什么?

拼接符的作用是把两个或多个信号的某些位拼接起来进行运算操作。因为借助拼接符可以用一个符号名来表示由多位信号组成的复杂信号。其物理意义是将多个信号结合成一个信号。

46.如果都不带时间延迟,阻塞和非阻塞赋值有什么不同?举例说明它们的不同点?

阻塞和非阻塞赋值的区别在阻塞是顺序执行而非阻塞是并行执行。

以下面的语句举例

非阻塞赋值
always@(posedge clk)
begin
b<=a;
c<=b;
end

阻塞赋值
always@(posedge clk)
begin
b=a;
c=b;
end

两种不同的赋值方式结果是不同的,非阻塞赋值b<=a;c<=b;两条语句是同时执行的,而阻塞赋值b=a;c=b;两条语句先执行b=a后执行c=b。

47.说明顺序块和并行块的不同?

begin
#50 r=’ h35;
#50 r=’ hE2;
#50 r= ‘ h00;
#50 r=’ hF7;
#50 ->end_ wave;
end

fork
#50 r=’ h35;
#100 r=’ hE2;
#150 r= ‘h00;
#200 r=’ hF7;
#250 ->end wave;
join

上面两个块执行起来效果是完全-样的,第一个模块是按顺序执行,而第二个模块是每个语句同时执行的。

48.如果在顺序块中,前面有一条语句是无限循环,下面的语句能否进行?

下面的语句不能执行。

49.如果在并行块中,发生上述情况,会如何呢?

下面的语句能够执行。

50.为什么建议在编写Verilog模块程序时,如果用到if语句建议大家把配套的else情况也考虑在内?

因为如果没有配套的else语句,在不满足if条件语句时,将会保持原来的状态不变,从而在综合时会产生一个锁存器,而这是设计不想要的结果。

51.用if语句,elseif 语句, elseif 语句,…else 语句和用case,endcase表示不同条件下的多个分支是完全相同的,还是有什么不同?

不是完全相同。与case语句中的控制表达式和多分支表达式这种比较相比,if else_ if结构中条件表达式更为直观些;对于那些分支表达式中存在不定值x和高阻值z的位时case语句提供了处理这种情况的段。

52.如果case语句的分支条件没有覆盖所有可能的组合条件,定义了default项和没有定义default项有什么不同?

定义了default项则会使电路描述的更加的清楚,综合的时候不会产生不想要的结果,没用定义default则会使在综合是产生一个锁存器。

53.仔细阐释case、casex 和casez之间的不同。
加粗样式
在这里插入图片描述
case、casex、 casez 对应的真值表如上

可以看出case 无论是0,1,还是x高阻都能够比较

而casez不将高阻进行比较,在其它情况都进行比较

而casex不将高阻和x进行比较,在其它情况进行比较

54.forever语句如果运行了,在它下面的语句能否运行?它位于begin end和位于fork join块有什么不同?

不能运行。位于begin end,由于begin and是顺序块,所以只要执行到forever则将不能运行下面的程序;而位于fork join,它是并行块,执行了forever 还是能够执行forever下面的语句。

55.forever语句repeat语句能否独立于过程块而存在,即能否不在initial或always 块中使用?

forever不能独立于过程块中,而repeat能够独立于过程块中。

56.用for循环为存储器许多单元赋值时是否需要时间?为什么如果不定义时间延迟,它可以不需要时间就把不管多大的储存器赋值完毕?

如果定义了时间延迟则需要时间,否则不需要时间。因为循环的边界是确定的,那么在综合时该循环语句被认为是重复的硬件结构。

57.for循环是否可以表示可以综合的组合逻辑?请举例说明。

可以表示综合的组合逻辑。例如用for循环实现的乘法器。

58.在编写测试模块时用什么方法可以使for循环按照时钟的节拍运行?请比较下面的程序段。


always @( posedge clk)
begin
for( i=0; i<=1024; i=i+1)
mem[i] = i;
end

initial
begin
for( i=0; i<=1024; i=i+1)
begin
mem[i] = i;
@( posedge clk)
end
end

可以在for循环的最后嵌套时钟节拍运行的信号。第一种程序不能按照时钟节拍来对mem[i]赋值,而第二种程序可以。

59.声明一个为oscillate的寄存器变量并将它初始化为0,使其每30个时间单位进行一次取反操作,不要使用always语句(提示:使用forever 循环)。

reg oscillate;
initial
begin
oscillate=0;
forever
#30 oscillate=! Oscillate;
end

60.设计一个周期为40个时钟单位的时钟循环,其占空比为25%,使用always和initial块进行设计,将其在仿真0时刻的值初始化为0。

initial
begin
clock=0;
always
begin
#30 clock=0;
#10 clock= 1;
end
end

61.给定下面含有阻塞过程赋值语句的initial块,每个语句在什么仿真时刻开始执行?a,b,c和d在仿真过程中的中间值和仿真结束时的值是什么?

initial
begin
①a=1’b0;
②b=#10 1’b0;
③c=#5 I’b0;
④d=#20{a,b,c};
end
第一条语句在仿真开始时就执行,第二句在仿真10个时钟单元后执行,第三句在仿真15个时钟信号单元后执行,第四句在仿真35个时钟单元后执行。在中间仿真过程中a=0,b,c,d为不确定值,结束时abed的值是a=1’b0,b= 1’0,c= 1’0,d=3’b000。

62.在第61题中,如果initial块中包含的是非阻塞过程赋值语句,那么各个问题的答案是什么?

如果是非阻塞过程赋值则答案是;第一条语句在仿真开始时就执行,第二句在仿真10个时钟单元后执行,第三句在仿真5个时钟信号单元后执行,第四句在仿真20个时钟单元后执行。在中间仿真过程a=0,b,c,d 为不确定值结束时abcd的值是a=1b0,b=1’0,c=1’0,d=3’b000。

63.下面例子中d的最终值是什么?

initial
begin
b=1"b1;
c=1’b0;
#10 b=1’b0; ,
end
initial
begin
d=#25(b|c);
end
d的最终值0。

64.使用带同步清零端的D触发器(清零高电平有效,在时钟下降沿执行清零操作)设计下一个下降沿触发的D触发器,只能使用行为语句(提示: D触发器的输出q应当声明为寄存器变量)。使用设计出的D触发器输出一个周期为10个时间单位的时钟信号。

module D_ FF(CLR,CLK,D,Q);
input CLR,CLK,D;
output Q;
reg Q;
always @(posedge CLR or necedge CLK)
begin
if(CLR) Q=0;
else
#10Q<=D;
end
endmodule

65.使用带有异步清零端的D触发器设计第64题要求的D触发器(在清零端变为高电平后立即执行清零操作,无须等待下一个时钟下降沿),并对这个D触发器进行测试。

module D_ FF(CLR,CLK,D,Q);
input CLR,CLK,D;
output Q;
regQ;

always @(posedge CLR )
begin
Q<=0;
end

always @(necedge CLK)
begin
#10Q<=D;
end
endmodule

66.使用wait语句设计一个电平敏感的锁存器,该锁存器的输入信号为d和clock输出为q,其功能是当clock=1时q=d; .

module L_ FF(d,clock,q);
input d,clk;
output q;
reg q;
always
begin
wait(clock==1)
q=d;
end
endmodule

67.使用while循环设计一个时钟信号发生器。其时钟信号的初值为0,周期为10个时间单元。

initial
begin
clk=0;
while(1)
#10 clk = !clk;
end

68.使用for 循环对一个长度为1024(地址从0~ 1023)、位宽为4的寄存器类型数组cache_ var 进行初始化,把所有单元都设置为0。

begin
reg[3:0] cache_ var[1023:0];
intiger i;
for(i=0;i<1024;i++)
cache_ var[i]=0;
end

69.使用forever 循环设计一个时钟信号,周期为10,占空比为40%,初值为0。

initial
begin
clk=0;
forever
begin
#6 clk=0;
#4 clk=1;
end
end

70.使用repeat 将语句a=a+1延迟20个时钟上升沿之后再执行。

parameter delay= 20;
intiger i;
reg a;
begin
repeat(delay)
always @(posedge clk)
begin
i++;
if(i== 20)
a=a+1;
end
end

71.下面是一个内嵌顺序块和并行块的块语句。该块的执行结束时间是多少?事件的顺序是怎样的?每条语句的仿真结束时间是多少?

initial
begin
x=1’b0;
#5 y=1’b1; //5
fork
#20 a=x; //25
#15 b=y; //20
join
#40 x=1"b1; //65
fork
#10p=x; //75
begin
#10a=y; //75
#30b=x; //105
end
#5 m=y; //70
join
end

该块的执行结束时间是5+20+40+40= 105个时钟单位

72.怎样理解initial语句只执行一次的概念?

在仿真开始时,initial 语句只执行一次,但initial 语句里面的语句可能不执行一次,因为如果是while循环,虽然initial语句是执行一次,但只要进了while循环,则会执行到仿真结束。

73.在initial 语句引导的过程中是否可以有循环语句?如果可以,是否与72题互相矛盾?

可以,并不互相矛盾。initial 语句确实是执行了一次,但并不意味着initial 语句过程中就不能是循环语句,两者并不矛盾。

74.怎样理解由always语句引导的过程块是不断活动的?

always语句的过程块是不断活动的,在仿真过程中always块始终在循环的活动着,检查always语句后面的信号是否发生相应改变,这是always活动的实质,如果always语句后面没有检查的信号则将会进入一个循环,将会使仿真器锁死。

75.不断活动与不断执行有什么不同?

不断活动是always语句不断活动检查是否满足条件(如某个信号发生改变),不断执行时always语句引导的过程中的语句不断的执行着。

76.怎样理解沿触发和电平触发的不同?

沿触发是在某个信号在上升沿或下降沿到来时,触发执行过程块。电平触发是在某个信号发生改变时就会触发执行过程块。

77.是不是可以说沿触发是有间隔的,在一定的时间区间里只需要注意有限的点,而电平触发却需要注意无穷多个点?

不是。沿触发是信号的上升沿或下降沿进行触发,而电平触发是在某个信号发生改变时进行触发,并不需要注意无穷多个点。

78.沿触发的always块和电平触发的always块各表示什么类型的逻辑电路的行为?为什么?

沿触发的always块常表示时序逻辑电路,因为其和时序有很关。电平触发的always块常表示组合逻辑电路,因为只和电平有关。

79.简单叙述任务和函数的不同点。

(1)函数只能与主模块共用同一个仿真时间单元,而任务可以定义自己的仿真时间单位;
(2)函数不能启动任务,而任务能启动其他任务和函数;
(3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;
(4)函数返回一个值,而任务则不返回值。

80.简单叙述 $display、 $write 和 $strobe的不同点。

$display自动地在输出后进行换行, $write则不进行自动换行,其它都非常相似。如果许多其他语句与 $display任务在同一个时间单位执行,那么这些语句与 $display任务的执行顺序是不确定的。如果使用 $strobe,该语句总是在同时刻的其他赋值语句执行完成之后执行。

81.简单叙述Verilog1364-2001版语法规定的电平敏感列表的简化写法。

关键词“or”也可以使用“ * ”来代替。

82.如何在Verilog测试模块中,利用文件的读写产生预定格式的信号,并记录有测试价值的信号?

Verilog提供了系统任务来:
选择要转储的模块实例或模块实例信号(dumpvars)
选择VCD文件的名称 ($ dumpfile)
选择转储过程的起点和终点($ dumppon,$ dumpoff)
选择生成检测点($ dunpall)

83.为什么在多个模块调试的情况下$ monitor需要配合$ monitoron和$ monitoroff来工作?

monitoron和 monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务 monitor的启动和停止,这样使得程序员可以很容易地控制 monitor何时发生。monitoron则用于打开监控标志,启动监控任务 monitor。通常在通过调用 monitoron来启动monitor,不管monitor参数列表中的值是否发生改变,总是立刻输出显示当前时刻参数列表中的值,这用于在监控的初始时刻设定初始比较值。在默认情况下,控制标志在仿真的起始时刻就已经打开了。在多模式调试的情况下,许多模块中都调用了 monitor,因为任何时刻只能用一个 monitor起作用,因此需配合 monitoron与 monitoroff使用,把需要监视的模块用monitor打开,在监视完毕后及时用 monitoroff关闭,以便把monitor让给其他模块使用。

84.请用$ random配合求模运算编写:
(1)用于测试的跳变沿抖动为周期1/10的时钟波形。
(2)随机出现的脉宽随机的窄脉宽。

module
random_ pulse(dout);
output[9:0] dout;
reg[9:0] dout;
integer delay;
initial
begin
#10 dout=0;
for(k= 0;k<100;k=k+1)
begin
delay= {$ random}%10;
#delay dout=1;
#delay dout=0;
end .
end
endmodule

85.Verilog的编译预处理与C语言的编译预处理有什么不同?

Verilog的编译处理,在编译处理命令之前要以`开头。

86.仔细阐释`timescale编译预处理的作用?

timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。使用timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。

87.不同 `timescale定义的多模块仿真测试时需要注意什么?

如果在同一个设计里,多个模块中用到的时间单位和时间精度单位不同,需要用到以下的时间结构:

(1)用timescale命令来声明本模块中所用到的时间单位和时间精度;

(2)用系统任务$ printtimnescale来输出显示一个模块的时间单位和时间精度;

(3)用系统函数$ time和$ realtime及%t格式声明来输出显示EDA工具记录的时间信息。

88.为什么说系统任务$ readmen可以用来产生用于算法验证的极其复杂的测试用数据流?

在Verilog HDL程序中有两个系统任务$ readmemb和$ readmemh,并用来从文件中读取数据到存储器中,这两个系统任务可以在仿真的任何时刻被执行使用,复杂数据可以用C语言产生,存在文件中,用 $ readmem取出存入存储器,再按节拍输出,这在验证算法逻辑电路时特别有用。

89.为什么熟练地使用条件编译命令可以使源代码有更大的灵活性,可以使用于不同的实现对象,如不同工艺的ASIC或速度规模不同的FPGA或CPLD,从而为软核的商品化创造条件?

合理的使用条件编译和条件执行预处理可以使测试程序适应不同的编译环境,也可以把不同的测试过程编写到一个统一的测试程序中去,可以简化测试的过程,对于复杂设计的验证模块的编写很有实用价值。

90.Verilog HDL的模型共有哪几种类型(级别)?

有5种类型,系统级,算法级,RTL级,门级,开关级。

91.每种类型的Verilog HDL各有什么特点?主要用于什么场合?

系统级,算法级和RTL级是属于行为级,门级是属于结构级的。

系统级:用高级语言结构实现设计模块的外部性能的模型。

算法级:用高级语言结构实现设计算法的模型。

RTL级:描述数据在寄存器之间流动和如何处理这些数据的模型。

门级:描述逻辑门以及逻辑门之间的连接的模型。

开关级:描述器件中三极管和存储节点以及它们之间连接的模型。

92.不可综合成为电路的Verilog模块有什么好处?

描述比较直观

93.为什么说VerilogHDL的语言结构可以支持构成任意复杂的数字逻辑系统?

通过Verilog语言中的模块实例引用,可以构成任何复杂结构的电路,这种以结构方式所
建成的Verilog模型不仅是可以以仿真的,而且也是可以综合的,其本质是表示电路的具体结构,也可以说这种Verilog文件也是一一种结构网表。

94.什么是综合?是否任何符合语法的Verilog HDL程序都可以综合?

综合是通过综合器把HDL程序转化成标准的门级结构网表。不是任何复合语法的Verilog
HDL程序都可以综合。

95.综合生成的是不是真实的电路?若不是,还需要哪些步骤才能真正成为具体的电路?

不是,真实的电路还需要利用ASIC和FPGA制造厂商的布局布线工具,根据综合生成的
标准的门级结构网来产生。

96.为什么综合以后还可以用Verilog进行仿真?

通过综合以后产生的是门级结构,而门级结构再经过Verilog仿真测试验证其正确性。

97.同一物理电路的行为模块仿真验证与结构模块的仿真验证在意义上有什么不同?

行为模块的仿真首先要转换为结构模块再进行仿真验证,结构模块是直接进行仿真的。

98.为什么说前端逻辑设计必须包含结构仿真验证,只有行为验证是远远不够的?

只有行为仿真远远不够的,因为VerilogHDL各种建模的方法,发挥各自在不同类型电路描述中的长处,而且要在层次管理工具的协调下把各个既独立又相互联系的模块组和,才能有效的设计出高质量的数字电路来。

99.什么是TOP-DOWN设计方法?通过什么手段来验证系统分块的合理性。

通过行为建模把一个复杂的系统分解成可操作的若干个模块,每个模块之间的逻辑关系
通过行为建模的仿真加以验证。

100.用什么方法可以把行为模块转换为结构模块?

用EDA综合王具可以把行为模块转换为结构模块。

101.写出八位加法器和八位乘法器的逻辑表达式,比较用超前进位逻辑和不用超前进位逻辑的延迟。

八位加法器:
module add8 ( a,b,sum,cout) ;
input[7:0] a,b;
output[7:0] sum;
output cout; .
assign {count,sum}=a+b;
endmodule
八位乘法器:
module add8 (a,b,m) ;
input[7:0] a,b;
output[15:0] m;
assign m=a*b;
endmodule
用超前进位逻辑可以减少由于逐位进位信号的传递所造成的延时。

102.为什么用算法操作符号表示的加法器和乘法器能通过综合器转变为逻辑电路?除了用算法操作符的表达式实现加法器和乘法器外,是否可以直接引用可配置的参数化实例来实现算术操作电路?

因为库中已经存在着可配置的参数化加法器乘法器的电路结构和相应行为模型。可以直接引用可配置的参数化实例来实现算术操作电路。

103.提高复杂运算组合逻辑运算速度有哪些办法?

采用流水线的设计方法,用总线的方式实现数据流通。

104.如何用Verilog HDL模块来描述总线的操作?为什么总线的操作必须有严格的时序控制?

各运算部件和数据寄存器可以通过带控制的三态门与总线的连接,通过对控制端电平的控制来确定在某一段时间内, 总线归哪两个或哪几个部件使用。因为使总线连接模块能正常工作的最重要的因素是与其他模块的配合,控制信号的互相配合由同步状态机控制的开关阵列控制。

105.详细解释为什么采用流水线的办法可以显著提高层次多的复杂组合逻辑的运算速度。

采用流水线技术可以在相同的半导体工艺的前提下通过电路结构的改进大幅度地提高重复多次使用的复杂组合逻辑计算电路的吞吐量,从而来提高层次多的复杂组合逻辑的运算速度。如果某个组合逻辑设计的处理流程可以分为若干个步骤,而且整个数据处理过程是单向的即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高系统的数据处理频率即吞吐量。把组合逻辑分成延迟时间相等的小块,每块完成一定的组合逻辑功能都用寄存器暂存保存组合逻辑输出的数据值,只要小块的组合逻辑的延迟小于时钟周期,整个组合逻辑的输入值每个时钟就可以变化一次不会由于组合逻辑的延迟引起输出值的错误,若没有这些寄存器来暂时保存局部组合逻辑的输出
值,则为了保证整个组合逻辑的输出正确,输出端信号的变化周期必须大于整体逻辑的延迟时间。数据处理的吞吐量受到限制,采用流水线方法,虽然第一次输出有较长的延迟,但过了若干个周期后,每个时钟周期可以输出值一次,数据处理的频率,即吞吐量大大增加了。

106.利用数字电路的基本知识解释,为什么说即使组合逻辑的输出端的所有信号同时变化,其输出端的各个信号不可能同时达到新的值?各个信号变化快慢有什么决定?

由于逻辑门和布线有延迟,因此没有办法使实际电路的输出与理想的布尔方程计算完全一致,可以说实际组合逻辑电路输出的瞬间不确定性是无法避免的。所以说即使组合逻辑的输出端的所有信号同时变化,其输出端的各个信号不可能同时达到新的值。各个信号变化的快慢与逻辑门和布线造成的传输延时有关。

107.如果组合逻辑的输入端信号变化非常快,其输出端的逻辑关系能否正确?变化快到什么程度以后,就没有正确的输出?如果还有正确输出,但时间片段很少,有什么办法可以加长正确输出的时间片?

其输出端的逻辑关系不能确定是否正确。当快到比确定下一个状态所使用的组合电路的延迟都快,就没有正确的输出。在输出端后加一个寄存器,有一个时钟控制,时钟周期宽度尽可能大些。

108.为使运算组合逻辑有一个正确的输出,为什么必须在复杂运算组合逻辑的输入端和输出端增加寄存器组来存放数据?

由于逻辑门和布线有延迟,因此没有办法使实际电路的输出与理想的布尔方程计算完全一致,可以说实际组合逻辑电路输出的瞬间不确定性是无法避免的。如果能使组合逻辑电路的输入端稳定一段时间,即所有的输入信号在一段相对较长的时间段里不再发生变化,虽然在稳定时间片段的刚一开始由于冒险竞争现象会产生与理想情况不一致的毛刺或输出不确定的情况,但只要稳定时间片段大于最长的路径延迟,就可以取得组合逻辑电路的理想输出。如果能躲开输出不确定片段,在理想值稳定输出的片刻把该输出端存入寄存器组,则寄存器组中保留的就是该组合逻辑电路的理想输出。

109.对每一个寄存器组来说,上一个时钟的正跳沿是为置数做准备,下一个时钟正跳沿是把本寄存器组置数(并为下一级运算组合逻辑送去输入信号),则为下一级寄存器组的置数做准备的先决条件是什么?

确定下一个状态所使用的组合电路的延迟和时钟到各触发器的差值必须小于一个时钟周期的宽度。

110.Verilog语法中使用了哪一种赋值符号刻意表示与硬件寄存器组实现完全一致的赋值方式?

用"<="赋值符号刻意表示与硬件寄存器组实现完全一致的赋值方式。

111.一个带使能端的寄存器组被赋入一个正确的输入值需要哪三个条件?

(1)启用同步时序逻辑;

(2)下一个状态所使用的组合电路的延迟和时钟到各触发器的差值必须小于一个时钟周期的宽度;

(3)使能端被使能。

112.为什么建议大家采用同步时序来设计数字逻辑电路,异步逻辑有什么不好?

用Verilog HDL设计的可综合模块,必须避免使用异步时序逻辑,这不但是因为许多综合器不支持异步时序逻辑的综合,而且因为用异步时序逻辑确实很难控制由组合逻辑和延迟所产生的冒险和竞争。当电路的复杂度增加时,异步时序逻辑无法调试。工艺的细微变化也会造成异步时序逻辑电路的失效。因为异步时序逻辑中触发条件很随意,任何时刻都有可能发生,所以记录状态的寄存器组的输出在任何时刻都能发生变化。而同步时序逻辑中的触发输入至少可以维持一个时钟后才会发生第二次触发。这是一个非常重要的差别,因为可以利用这一时间段,即在下一个触发信号来到之前为电路状态的改变创造一个稳定可靠地条件。

113.简单叙述不同时钟域模块之间数据准确传送的方法。

使用双口RAM(DPRAM)、FIFO 缓冲的方法完成异步时钟域之间的数据传递。在输入端口使用前级时钟写数据,在输出端口使用本机时钟读数据,并有缓冲器空或满的控制信号来管理数据的读写,以避免数据的丢失,可以非常方便准确地完成异步时钟域之间的数据交换。

114.举例说明状态分配对状态机电路的复杂度和速度的影响。

状态的分配不同在于有的使用独热码,有的使用格雷码。对于用FPGA实现的有限状态机建议采用独热码,因为虽然独热编码多用了两个触发器,但所用组合电路可省些,因而使用电路的速度和可靠性有显著提高,而总的单元数并无显著增加,采用独热编码后有了多余的状态,就有一些不可到达的状态,为此可以用默认项表示不可达到的状态。

115.分别说明和解释两种不同赋值(即非阻塞赋值“<=”和阻塞赋值“=”)的用法,和逻辑关系符号“ == ”的含义。

用“<=”赋值,表示在过程块结束以后才进行赋值,是并行结构。用“=”赋值,表示是立即进行赋值是顺序结构。两个赋值作用是一样的。逻辑关系符号“== ”是表示判断的符号,用到判断信号是否为符合条件的信号,如 if(a ==2’b10)则表示a是否为2’b10。

116.一般情况下状态机中的状态变量是用来干什么的?是否可以把状态变量中的某些位指定为状态机的输出,直接用来控制逻辑开关?这样做有什么好处?有什么缺点?

用来表示状态机的几种状态,可以用来对不同状态进行转换。可以直接把状态变量中的某位指定为状态机的输出,直接用来控制逻辑开关。这样做可以提高输出信号的开关速度并节省电路器件。但这种方法的缺点就是开关的维持时间必须与状态机的时间一致。

117.是不是只要符合Verilog语法仿真行为正确的模块都可以综合成电路结构?

不是,异步状态机不能够综合成电路结构。

118.为什么在用Verilog设计方法时不采用异步的状态机,采用异步状态机有什么问题不好解决?

因为大多数综合器不能综合采用VerilogHDL描述的异步状态机转换为电路网表。异步状态机是没有确定时间的状态机,它的状态转移不是由唯一的时钟跳变沿所触发。采用异步状态机不容易判别触发脉冲是正常的触发还是冒险竞争产生的毛刺。

119.用always块语句如何编写纯组合逻辑电路?在哪些情况下会生成不想要的锁存器?

用always块设计纯组合逻辑电路时,在生成组合逻辑的always块中参与赋值的所有信号都必须有明确地值,然后只要在always块中进行赋值就可以了。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,那么在综合时将会为该没有列出的信号隐含的产生一个透明锁存器。

120.把标准的可综合的带同步复位指的同步状态机表达出来。

always@(posedge clk)begin
if(reset)
begin
output<=0;
end
else
begin
output<=1;
end
end

121.把标准的可综合的带异步复位指的同步状态机表达出来。

always@(posedge clk or posedge reset)begin
if(reset)
begin
output<=0;
end
else
begin
output<=1;
end
end

122.这两种不同的同步状态机有什么不同?如果输入的复位脉冲很窄,哪种状态机不能可靠复位?

异步复位端的同步状态机的复位与时钟无关。当复位时他们立即置触发器的输出为0,不需要等到时钟沿到来才复位。
带同步复位端的同步状态机的复位只有在时钟的有效跳变沿时刻复位,信号才能使触发器复位。如果输入的复位脉冲很窄,同步复位端的同步状态机不能可靠复位。

123.为什么说,掌握数字电路基础和计算机体系结构这两门学科的真谛是Verilog数字系统设计的基础?

当系统比较复杂时,需要通过仔细的分析,把一个具体的系统分解为数据流和控制流,构想哪些部分用组合逻辑,哪些部分的资源可以共享而不影响系统的性能,需要设置哪些开关逻辑来控制数据的流动,需要一个或几个同步有限状态机来正确有序地控制这些开关逻辑,以便有效地利用有限的硬件资源,才能编写出真正有价值的RTL级源代码,从而综合出有实用价值的高性能的数字逻辑电路系统。因此,认真的学习并掌握数字电路基础和计算机体系结构这两门学科的真谛是Verilog数字系统设计的基础。

124.如果一定要设计异步触发的计数电路,用Verilog描述有什么办法?能否综合?仿真时要注意什么问题?

编写另一个模块,在那个模块中使用另外一个时钟;然后用实例引用的方法在另一个模块中把它连接起来。能够综合。仿真时应尽量使这两个状态机的时钟有一定的联系。

125.用带电平敏感列表触发条件的always块表示组合逻辑时,应该用哪一种赋值?

应该用阻塞赋值

126.用带时钟沿触发条件的always块表示时序电路时,应该用哪一种赋值?

应该用非阻塞赋值

127.为什么不能在多个always块中为同一变量赋值?

多个always块中为同一个变量赋值可能会导致竞争冒险即使使用非阻塞赋值也可能产生竞争冒险。

128.为什么不能用$display系统任务来显示用非阻塞赋值的变量值?

因为非阻塞语句的赋值在所有的Sdisplay命令执行以后才更新数据。

129.$ strobe和$ display这两个显示用系统任务有什么不同?各用于什么场合?

$ display命令的执行是安排在活动事件队列中,但排在非阻赋值赋值数据更新事件之前
$ strobe命令的执行是排在非阻塞赋值数据更新事件之后。
$ display适合用来显示阻塞语句的赋值
$ strobe适合用来显示非阻塞语句的赋值

130.仿真器在处理阻塞和非阻塞赋值操作队列过程中有什么不同?

阻塞赋值是由动态事件队列调度的,而非阻塞赋值不是由动态事件队列调度。

  • 14
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值