Verilog数字系统设计(夏宇闻)—课后思考题记录(上)

  • Post author:
  • Post category:其他




00、绪论

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

数字信号处理电路是进行一些复杂的数字运算和数据处理,并且又有实时响应需求的电路。

它们通常是由高速专用数字逻辑系统或专用数字信号处理器所构成,通常包括高速数据通道接口和高速算法电路。

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

因为有的数字信号处理对时间的要求非常苛刻,以至于用高速的通用处理器也无法在规定的时间内完成必要的运算。通用微处理器芯片是为一般目的而设计的,运算的步骤必须通过编程编译后生成的机器码指令加载到存储器中,然后在微处理器芯片的控制下,按时钟的节拍,逐条取出指令分析指令和执行指令,直到程序的结束。微处理器芯片中的内部总线和运算部件也是为通用目的而设计,即使是专为信号处理而设计的通用微处理器,因为它的通用性也不可能为某一特殊的算法来设计一系列的专用的运算电路,而且其内部总线的宽度也不能随便的改变,只有通过改变程序,才能实现这个特殊的算法,因而其算法速度也受到限制,所以要设计专用的信号处理器。

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

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

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

因为现代复杂数字逻辑系统的设计都是借住于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。

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

不能,因为基础算法的描述和验证常用C语言来做。

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

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

首先,C语言很灵活,查错功能强,还可以通过 PLI (编程语言接口)编写自己的系统任务,并直接与硬件仿真器结合使用。C语言是目前世界上应用最为广泛的一种编程语言,因而C程序的设计环境比VerilogHDL更完整。

此外,C语言有可靠地编译环境,语法完备,缺陷缺少,应用于许多的领域。比较起来,

Verilog语言只是针对硬件描述的,在别处使用并不方便。

而用Verilog的仿真,综合,查错等大部分软件都是商业软件,与C语言相比缺乏长期大量的使用,可靠性较差,亦有很多缺陷。所以只有在C语言的配合使用下,Verilog才能更好地发挥作用。C语言与VerilogHDL语言相辅相成,互相配合使用。这就是既利用C语言的完整性又要结合Verilog对硬件描述的精确性,来更快更好地设计出符合性能要求的硬件电路系统,从而来提高效率。



01、第1章Verilog的基本知识

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

  • 硬件描述语言(HDL, hardware description language)是一种用形式化方法来描述数字电路和系统的语言。
  • 作用:数字电路系统的设计者利用这种语言可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后利用电子设计自动化(简称为EDA)工具逐层进行仿真验证,再把其中需要变为具体物理电路的模块组合经由自动综合工具转换到门级电路网表。接下去再用专用集成电路(ASIC)或现场可编程门阵列(FPGA)自动布局布线工具把网表转换为具体电路布线结构的实现。

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

  • Verilog HDL和 VHDL都是用于逻辑设计的硬件描述语言,并且都已成为IEEE标准。VHDL是在1987年成为IEEE标准,Verilog HDL则在1995年才正式成为IEEE标准。VHDL其英文全名为 VHSIC Hardware Description Language。而 VHSIC则是 Very High Speed Integerated Circuit的缩写词,意为甚高速集成电路,故VHDL其准确的中文译名为甚高速集成电路的硬件描述语言。

  • Verilog HDL和VHDL其共同的特点在于:

    • 能形式化地抽象表示电路的行为和结构;
    • 支持逻辑设计中层次与范围的描述;
    • 可借用高级语言的精巧结构来简化电路行为的描述;
    • 具有电路仿真与验证机制以保证设计的正确性;
    • 支持电路描述由高层到低层的综合转换;
    • 硬件描述与实现工艺无关(有关工艺参数可通过语言提供的属性包括进去);
    • 便于文档管理;
    • 易于理解和设计重用。
  • 与VHDL相比Verilog HDL的最大优点是:它是一种非常容易掌握的硬件描述语言,只要有C语言的编程基础,通过20学时的学习,再加上一段实际操作,一般同学可在2~3个月内掌握这种设计方法的基本技术。而掌握VHDL设计技术就比较困难。这是因为VHDL不很直观,需要有Ada编程基础,一般认为至少需要半年以上的专业培训,才能掌握VHDL的基本设计技术。

  • 下图所示为Verilog HDL和VHDL建模能力的比较图。

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

  • 近年来,FPGA和ASIC的设计在规模和复杂度方面不断取得进展,而对逻辑电路及系统的设计时间要求却越来越短。这些因素促使设计人员采用高水准的设计工具,如:硬件描述语言(Verilog HDL或VHDL)来进行设计。

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

  • 采用Verilog输入法最大的优点是其与工艺无关性。这使得工程师在功能设计,逻辑验证阶段,可以不必过多考虑门级及工艺实现的具体细节,只需要利用系统设计时对芯片的要求,施加不同的约束条件,即可设计出实际电路。
  • 缺点是:需要响应的EDA工具,而EDA工具的稳定性需要进一步的在工程中提升。

5、简单叙述一下利用 EDA工具并采用硬件描述语言(HDL)的设计方法和流程。

  • 采用自顶向下的设计(即Top_Down设计)方法:从系统级开始把系统划分为基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接用EDA元件库中的基本元件来实现为止。
  • 其基本流程主要由两大功能部分组成:

    • (1)设计开发,即从编写设计文档→综合到布局布线→电路生产这样一序列步骤。
    • (2)设计验证,也就是进行各种仿真的一序列步骤,如果在仿真过程中发现问题就返回设计输入进行修改。

6、硬件描述语言可以用哪两种方式参与复杂数字电路的设计?

  • 复杂数字电路的设计和复杂数字电路的仿真验证。

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

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

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

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

9、软核是什么?虚拟器件是什么?它们的作用是什么?

  • 把功能经过验证的、可综合的、实现后电路结构总门数在5 000门以上的Verilog HDL模型称为**“软核”(Soft Core)**。
  • 把由软核构成的器件称为虚拟器件,在新电路的研制过程中,软核和虚拟器件可以很容易地借助EDA综合工具与其他外部逻辑结合为一体。这样,软核和虚拟器件的重用性就可大大缩短设计周期,加快了复杂电路的设计。

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

  • 在数字逻辑设计领域,迫切需要一种共同的工业标准来统一对数字逻辑电路及系统的描述,这样就能把系统设计工作分解为逻辑设计(前端),电路实现(后端)和验证三个互相独立而又相关的部分。由于逻辑设计的相对独立性就可以把专家们设计的各种常用数字逻辑电路和组件(如 FFT算法、DCT算法部件、DDRAM 读写控制器等)建成宏单元( megcell)或

    软(固/硬)核,也称作Soft(firm/hard)Core,即 IP(知识产权内核的英文缩写)库

    供设计者引用。设计者可以直接利用它们的行为模型设计并验证其他电路,以减少重复劳动,提高工作效率。
  • 在集成电路行业中IP是知识产权(IntellectualProperty)的含义。
  • 把在某一现场可编程门阵列(FPGA)器件上实现的、经检验证明是正确的、总门数在5000门以上的电路结构编码文件称为**“固核”(firm core)**。
  • 把在某一专用集成电路工艺的(ASIC)器件上实现的、经检验证明是正确的、总门数在5000门以上的门电路结构版图掩膜称为**“硬核”(hard core)**。
  • 在工具实现手段和工艺技术尚未确定的逻辑设计阶段,IP核具有很大的灵活性,很容易借助EDA工具与其他外部逻辑结合为一体。相比之下固核和硬核与其他外部逻辑结合为一体的灵活性要差很多。

11、简述Top_Down设计方法和硬件描述语言的关系。

  • Top_Down的设计方法是首先从系统设计入手,从顶层进行功能划分和结构设计。系统的总仿真时顶层进行功能划分的总要环节,而该过程需要采用硬件描述语言的方法。

12、System Verilog 与Verilog有什么关系?适用于何种设计?

  • Verilog适合系统级( system)、算法级(alogrithem)、寄存器传输级(RTL)、逻辑级(logic)、门级(gate)、电路开关级(switch)设计。

  • 而SystemVerilog 是Verilog语言的扩展和延伸,更适用于可重用的可综合IP和可重用的验证用IP设计,以及特大型(千万门级以上)基于IP的系统级设计和验证。



02、第2章Verilog语法的基本概念

1、Verilog语言有什么作用?

Verilog HDL是一种用于数字系统设计的语言。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块。Verilog HDL既是一种行为描述的语言也是一种结构描述的语言。这就是说,无论描述电路功能行为的模块或描述元器件或较大部件互联的模块都可以用Verilog 语言来建立电路模型。如果按照一定的规则和风格编写,功能行为模块可以通过工具自动地转换为门级互联的结构模块。Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别和它们所对应的模型类型共有以下5种,现分别给以简述。

  • (1)系统级(system-level):用语言提供的高级结构能够实现待设计模块的外部性能的模型。

  • (2)算法级( algorithm-level):用语言提供的高级结构能够实现算法运行的模型。

  • (3)RTL级(register transfer level):描述数据在寄存器之间的流动和如何处理、控制这些数据流动的模型。

    以上三种都属于行为描述,只有RTL级才有与逻辑电路有明确的对应关系。

  • (4)门级(gate-level):描述逻辑门以及逻辑门之间连接的模型。

    与逻辑电路有确定的连接关系,以上4种数字系统设计工程师必须掌握。

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

这与具体的物理电路有对应关系,工艺库元件和宏部件设计人员必须掌握,将在高级教程中介绍。

一个复杂电路系统的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。其中有些模块需要综合成具体电路,而有些模块只是与用户所设计的模块有交互联系的现存电路或激励信号源。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构,以此来描述极其复杂的大型设计,并对所作设计的逻辑电路进行严格的验证。

Verilog HDL行为描述语言作为一种结构化和过程性的语言,其语法结构非常适合于算法级和RTL级的模型设计。这种行为描述语言具有以下功能:

  • 可描述顺序执行或并行执行的程序结构;
  • 用延迟表达式或事件表达式来明确地控制过程的启动时间;
  • 通过命名的事件来触发其他过程里的激活行为或停止行为;
  • 提供了条件如 if-else,case等循环程序结构;
  • 提供了可带参数且非零延续时间的任务(task)程序结构;
  • 提供了可定义新的操作符的函数结构(function);
  • 提供了用于建立表达式的算术运算符、逻辑运算符、位运算符;
  • Verilog HDL语言作为一种结构化的语言非常适用于门级和开关级的模型设计。因其结构化的特点又使它具有以下功能:

    • 提供了一套完整的表示组合逻辑的基本元件的原语(primitive) ;
    • 提供了双向通路(总线)和电阻器件的原语;
    • 可建立MOS器件的电荷分享和电荷衰减动态模型。

Verilog HDL的构造性语句可以精确地建立信号的模型。这是因为在 Verilog HDL中,提供了延迟和输出强度的原语来建立精确程度很高的信号模型。信号值可以有不同的强度,可以通过设定宽范围的模糊值来降低不确定条件的影响。

Verilog HDL作为一种高级的硬件描述编程语言,与C语言的风格有许多类似之处。其中有许多语句,如 if语句,case语句和C语言中的对应语句十分相似。

2、构成模块的关键词是什么?

module

endmodule

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

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

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

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

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

不能;

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

6、什么叫综合?

在编写Verilog模块时,不但符合语法,还符合一些基本规则,就可以通过计算机上的综合工具把行为级描述的模块通过逻辑网表自动转化为门级形式的模块叫综合。

7、综合是由什么工具来完成的?

由EDA工具来完成综合。

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

产生的是由与门,或门和非门组成的加法器、比较器和三态门等组合逻辑。

产生的模块很容易与某种工艺的基本元件逐一对应起来,再通过布局布线工具自动地转变为某种工具工艺的电路布线结构。

9、仿真是什么?为什么要进行仿真?

仿真是对电路模块进行动态的全面测试。

通过观察测试模块的输出信号是否符合要求,可以调试和验证逻辑系统的设计和结构准确与否,并发现问题及时修改。

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

分别为前(RTL)仿真、逻辑网表仿真、门级仿真和布线后仿真;

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

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

11、模块的端口是如何描述的?

用 “ . ”表示被引用模块的端口。

12、在引用实例模块的时候,如何在主模块中连接信号线?

小括号中表示本模块中与之连接的线路。

13、如何产生连续的周期性测试时钟?

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

always #50 clock = ~clock;	//产生一个不断重复的周期为100个时钟单位的时钟信号clock

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

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

15、从本讲的简单例子,是否能明白always块与initial块有什么不同?

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

16、为什么说Verilog可以用来设计数字逻辑电路和系统?

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



03、第3章模块的结构、数据类型、变量和基本运算符号

1、模块由几个部分组成?

  • Verilog的基本设计单元是“模块”(block)。
  • 一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能,即定义输入是如何影响输出的。

2、端口分为几种?

  • 输入口:input
  • 输出口:output
  • 输入\输出口:inout

3、为什么端口要说明信号的位宽?

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

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

  • 在许多方面,程序模块和电路图符号是一致的,这是因为电路图符号的引脚也就是程序模块的接口。而程序模块描述了电路图符号所能实现的逻辑功能。

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

  • 模块中最重要的部分是逻辑功能定义部分。有以下3种方法可在模块中产生逻辑。

    • (1)用“assign”声明语句

      //如:
      
      assign a=b & c;
      
      //这种方法的句法很简单,只须写一个“assign”,后面再加一个方程式即可。
      //例中的方程式描述了一个有两个输入的与门。
      
    • (2)用实例元件

      //如: 
      and #2 ul( q,a,b );
      //采用实例元件的方法像在电路图输入方式下调入库元件一样,键入元件的名字和相连的引脚即可。
      //这表示在设计中用到一个跟与门(and)一样的名为ul的与门,其输入端为a,b,输出为q。
      //输出延迟为2个单位时间。
      //要求每个实例元件的名字必须是唯一的,以避免与其他调用与门(and)的实例混淆。
      
    • (3)用“always”块

      //如:
      always @( posedge clk or posedge clr) begin
      	if(clr)
              q<= 0;
      	else if(en)
              q<= d;
      end
      
  • 采用“assign”语句是描述组合逻辑最常用的方法之一。

  • 而**“always”块既可用于描述组合逻辑,也可描述时序逻辑。**用“ always”块的例子生成了一个带有异步清除端的D触发器。“always”块可用很多种描述手段来表达逻辑,例如上例就用了if…else语句来表达逻辑关系。如按一定的风格来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。

  • 上面的3个例子分别采用了“assign”语句、实例元件和“always”块。这3个例子描述的逻辑功能是同时执行的。也就是说,如果把这3项写到一个Verilog模块文件中去,它们的顺序不会影响实现的功能。

    这3项是同时执行的,也就是并发的。

  • 然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。所以,**”always”块也称为“过程块”。**请注意,两个或更多的“always”模块都是同时执行的,而模块内部的语句是顺序执行的。看一下“always”内的语句,就会明白它是如何实现功能的。if…else…if必须顺序执行,否则其功能就没有任何意义。

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

  • 用实例元件直接与电路结构有关。
  • 采用实例元件的方法像在电路图输入方式下调入库元件一样,键入元件的名字和相连的引脚即可。

7、最基本的Verilog变量有几种类型?

  • wire型

    wire型数据常用来表示用以 assign关键字指定的组合逻辑信号。Verilog程序

    模块中输入、输出信号类型默认时自动定义为wire型

    。wire型信号可以用做任何方程式的输入,也可以用做“assign”语句或实例元件的输出。

  • reg型

    寄存器是数据储存单元的抽象,寄存器数据类型的关键字是reg。reg类型数据的默认初始值为不定值x。reg型数据常用来表示“always”模块内的指定信号,常代表触发器。

    在“always”模块内被赋值的每一个信号都必须定义成reg型。

  • memory型

    Verilog HDL通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM存储器和 reg文件。数组中的每一个单元通过一个数组索引进行寻址。在Verilog语言中没有多维数组存在。memory型数据是通过扩展reg型数据的地址范围来生成的。其格式如下:

    reg	[n一1:0]	存储器名	[m―1:0]	;
    //或
    reg	[n―1:0]	存储器名	[m: 1]	;
    
    //在这里,reg[n一1:0]定义了存储器中每一个存储单元的大小,即该存储单元是一个n位的寄存器;
    //存储器名后的[m—1:0]或[m:1]则定义了该存储器中有多少个这样的寄存器。
    //下面举例说明:
    reg	[7:0]	mema	[255:0]	;
    //这个例子定义了一个名为mema的存储器,该存储器有256个8位的存储器。该存储器的地址范围是0到255。
    

8、reg型和 wire型变量的差别是什么?

  • reg型变量是寄存器变量,wire型变量是连线型变量。
  • 两者根本性的差别在于reg型变量有个寄存器来存放变量,这个值只有变量发生改变时才会改变,否则保证原来的值不变,wire型变量的值不是确定的值。
  • 网络数据类型表示结构实体(例如门)之间的物理连接。网络类型的变量不能储存值,而且它必须受到驱动器(例如门或连续赋值语句assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。常用的网络数据类型包括wire型和 tri型。

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

  • 可以是reg类型的变量。

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

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

11、参数类型的变量有什么用处?

  • 在Verilog HDL中用parameter定义常量,即用parameter来定义一个标识符代表一个常量,称为符号常量,即标识符形式的常量,
  • 采用标识符代表一个常量可提高程序的可读性和可维护性。

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

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

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

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

14、是否可以说实例引用的描述实际上就是严格意义上的电路结构描述?

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



04、第4章运算符、赋值语句和结构说明语句

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

  • 逻辑运算符(&&与、||或、!非)运算时是两个操作数进行逻辑运算,返回结果为真或假。多用于条件的判断;
  • 按位逻辑运算符是两个操作数对应的每一位进行逻辑运算。按位逻辑运算符用于信号的运算和检测。

2、指出两种逻辑等式运算符的不同点,解释书上的真值表。

  • == 和 != 又称为逻辑等式运算符,其结果由两个操作数的值决定。由于操作数中某些位可能是不定值x和高阻值z,结果可能为不定值x。== 的真值表如下。

    == 0 1 x z
    0
    1
    0 x x
    1 0
    1
    x x
    x x x x x
    z x x x x
  • 而 === 和 !== 运算符则不同,它在对操作数进行比较时对某些位的不定值 x 和高阻值 z 也进行比较,

    两个操作数必须完全一致,其结果才是1,否则为0。

    === 和 !== 运算符常用于case表达式的判别,所以又称为“case等式运算符”。=== 的真值表如下。

    === 0 1 x z
    0
    1
    0 0 0
    1 0
    1
    0 0
    x 0 0
    1
    0
    z 0 0 0
    1

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

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

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

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

  • 非阻塞赋值:

    always @(posedge clk) begin
    	b <= a;
    	c <= b;
    end
    //定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b。
    //非阻塞赋值b<=a;c<=b;两条语句是同时执行的。
    

    赋值是在“always”块结束后执行的,c应为原来b的值,这里用到了

    两个触发器

    ,这个“always”块实际描述的电路功能如图所示。

  • 阻塞赋值:

    always @(posedge clk) begin
    	b = a;
    	c = b;
    end
    //阻塞赋值b=a;c=b;两条语句先执行b=a后执行c=b,最终的结果是c = a。
    

    阻塞赋值方式:clk信号的上升沿到来时,b马上取 a的值,c马上取b的值(即等于a) ,生成的电路如图所示,只用了一个触发器来寄存a的值,又输出给b和c。

5、举例说明顺序块和并行块的不同。

  • 块语句通常用来将两条或多条语句组合在一起,使其在格式上看更像一条语句。块语句有两种:

    • 一种是 begin_end 语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块;
    • 另一种是 fork_join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。
  • 下面两个块执行起来效果是完全一样的,第一个模块是按顺序执行,而第二个模块是每个语句同时执行的。
//顺序块
parameter d =50;
reg [7:0] r;
begin
	#d r = 'h35;
	#d r = 'hE2;
	#d r = 'h00;
	#d r = 'hF7;
	#d r -> end_wave;//触发事件end——wave
end
//并行块
reg [7:0] r;
fork
	#50 r = 'h35;
	#100 r = 'hE2;
	#150 r = 'h00;
	#200 r = 'hF7;
	#250 r -> end_wave;//触发事件end——wave
join

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

  • 下面的语句不能执行。

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

  • 下面的语句可以执行。



05、第5章条件语句、循环语句、块语句与生成语句



06、第6章结构语句、系统任务、函数语句和显示系统任务



07、第7章调试用系统任务和常用编译预处理语句



08、第8章语法概念总复习练习



版权声明:本文为qq_42794039原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。