《Verilog数字系统设计教程》[第3版] 夏宇闻_学习总结_9-18

第9章 Verilog HDL模型的不同抽象级别

事件:event;定义:event <name>; 触发:#time -> 事件名

用户定义原语,UDP, user defined primitives

primitive 元件名(输出端口名, 输入端口名1, ...)
    output 输出端口名;
    input  输入端口名1, ...;
    reg 输出端口名;
    initial begin
        输出端口寄存器或时序逻辑内部寄存器赋初值(0, 1, x);
    end
    table
        //输入1  输入2  ...  : 输出
        逻辑值   逻辑值  ...  : 逻辑值;
        逻辑值   逻辑值  ...  : 逻辑值;
        ...            ...  : ...  ;
    endtable
endprimitive

注意:

  1. UDP只能有一个输出端,必定是端口说明列表第一项;

  2. UDP可以有多个输入端,最多允许10个输入端;

  3. UDP所有端口变量必须是标量,也就是必须是1位的;

  4. 在UDP真值表项中,只允许出现0,1,x三种逻辑值,默认值为x;

  5. 只有输出端才可以被定义为寄存器类型变量;

  6. initial语句用于为时序电路内部寄存器赋初值,只允许0,1,x三种逻辑值,默认值为X。

思考题

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

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

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

    系统级、算法级、RTL级属于行为级,门级属于结构级。

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

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

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

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

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

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

    描述更直观。

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

    通过实例引用可以构成任意复杂结构的电路,这种结构方式可以仿真,也可以综合,本质是电路的具体结构,也可以说Verilog文件是一种结构网表。

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

    综合是通过综合器把HDL程序转化为标准的门级结构网表;不是。

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

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

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

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

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

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

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

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

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

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

  11. 编写两路每路为1位信号的二选一多路器的行为模块,再编写它的结构模块。然后编写测试模块分别对这两个模块进行测试,观测仿真运行的结果,编写实验报告。

    //行为模块
    module sel2x1(a, b, s, f);
        input a, b, s;
        output reg f;
        always @(*) begin
            if(s)   f = b;
            else    f = a;
        end
    endmodule
    //结构模块
    module sel2x1(a, b, s, f);
        input a, b, s;
        output f;
        wire sn, a1, a2;
        not u1(sn, s);
        and u2(a1, b, s),
            u3(a2, a, sn);
        or u4(f, a1, a2);
    endmodule
  12. 如果让你编写两路每路为8位信号的二选一多路器的结构模块是不是感觉麻烦?编写行为模块是不是很方便?

    行为模块会很方便,只需要将输入输出的1位改为8位。

第10章 如何编写和验证简单的纯组合逻辑模块

流水线(pipe-line)设计。

首次延迟(latency):将(从输入到输出)最长的路径进行初始化所需要的时间总量。

吞吐延迟:执行一次重复性操作所需要的时间总量。

如果某个组合逻辑设计的处理流程可以分为若干步骤,整个数据处理过程是“单流向”的,即没有反馈或迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑流水线设计方法提高系统的数据处理频率,即吞吐量。

思考题

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

    //8位加法器
    module add8(a, b, sum, cout);
        input [7:0] a, b;
        output [7:0] sum;
        output cout;
        assign {cout, sum} = a+b;
    endmodule
    //8位乘法器
    module mul8(a, b, m);
        input [7:0] a, b;
        output [15:0] m;
        assign m = a*b;
    endmodule

    超前进位逻辑可以减少进位信号的传递造成的延时。

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

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

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

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

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

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

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

    流水线技术可以在相同的半导体工艺的前提下通过电路结构的改进大幅度提高重复多次使用的复杂组合逻辑计算电路的吞吐量,从而提高层次多的复杂组合逻辑的运算速度。

    如果某个组合逻辑设计的处理流程可以分为若干个步骤,整个数据处理过程是单向的即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法提高系统的数据处理频率即吞吐量。把组合逻辑分成延迟时间相等的小块,每块完成一定的组合逻辑功能,用寄存器暂存组合逻辑输出的数据值,只要小块的组合逻辑的延迟小于时钟周期,整个组合逻辑的输入值每个时钟就可以变化一次,不会由于组合逻辑的延迟引起输出值的错误。采用流水线方法,虽然第一次输出有较长的延迟,但经过若干周期后,每个时钟周期可以输出值一次,数据处理的频率,即吞吐量大大增加。

第11章 复杂数字系统的构成

11.1 控制逻辑

//8位三态数据通路控制器
`define ON      1'b1
`define OFF     1'b0
wire LinkBusSwitch;
wire  [7:0] outbuf;
reg   [7:0] inbuf;
inout [7:0] bus;
assign bus = (LinkBusSwitch == `ON) ? outbuf:8'hzz;
always @(posedge clk) begin
    if (!LinkBusSwitch)
        inbuf <= bus;
    //...
end

11.4 同步时序逻辑

同步逻辑电路中,触发器的输入与输出由两个时钟完成的,利用上个时钟为下一个时钟创造触发条件的方式安全可靠,但有一个前提:确定下一个状态所使用的组合电路的延迟与时钟到各触发器的差值必须小于一个时钟周期的宽度。实际电路中,采取措施主要有以下几点:

  • 全局时钟网络布线时尽量使各分支的时钟一致

  • 采用平衡树结构,在每一级加入缓冲器,使到达每个触发器时钟端的时钟同步

11.5 数据接口同步

1)前级(如另一个芯片、PCB布线、驱动接口元件)输出的延时是随机的,或者有可能变动,如何在后级完成数据同步?

随机到达的数据,需要建立同步机制。可以采用使数据通过RAM或FIFO的缓存再读取的方法。

2)数据有固定的帧格式,数据的起始位置如何确定?

通信系统中,数据往往按帧组织的。在数据正确接收之前,必须先完成数据同步。找到数据头的方法有两种:增加一条表示数据起始位置的信号线;对于异步系统,常常在数据中插入一段有特殊码型的同步码(头),接收端检测同步头。

3)级联的两模块基本时钟是异步时钟域的,如何把前级输出的数据准确传送到下一级模块中?

异步时钟起码需要对输入数据做两次以上的采样寄存,才能初步完成输入数据的读入,只是防止了数据状态不稳定的传播,使后级电路处理的数据都是有效电平,并不能保证数据完全正确。为避免错误,常用双口RAM(DPRAM)、FIFO缓存完成异步时钟域的数据传送。

思考题

  1. 为什么说即使组合逻辑的输入端的所有信号同时变化,其输出端的各个信号不可能同时达到新的值?各个信号变化的快慢由什么决定?

    逻辑门和布线有延迟,实际电路输出无法与理想布尔表达式完全一致;各个信号变化快慢由逻辑门和布线造成的传输延时有关。

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

    输出端的逻辑关系不能确定;快到小于确定下一个状态所用的组合电路的延时,就没有正确的输出;输出端后加寄存器,控制时钟的周期大些。

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

    逻辑门和布线的延时使实际组合逻辑电路输出的瞬间不确定性无法避免。输出稳定时间够长可以避开一开始的竞争冒险现象,在理想值稳定输出的片刻将输出端存入寄存器组。

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

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

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

    非阻塞赋值,“<=”

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

    启用同步时序逻辑;下一个状态所用的组合电路的延时和时钟到触发器的差值必须小于一个时钟周期的宽度;使能端被使能。

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

    异步逻辑难以控制组合逻辑和延迟所产生的的冒险和竞争,工艺细微变化会造成异步时序逻辑电路失效,适用性差。

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

    使用双口RAM(DPRAM)、FIFO缓存的方法完成异步时钟域之间的数据传递;输入端口使用前级时钟写数据,输出端口使用本级时钟读数据,并由缓冲器空/满控制信号管理数据读写,避免数据丢失。

第12章 同步状态机的原理、结构和设计

12.2 Mealy状态机和Moore状态机不同点

Mealy状态机:时序逻辑的输出取决于当前状态和输入

Moore状态机:时序逻辑的输出只取决于当前状态

设计高速电路时,有必要使状态机的输出与时钟几乎完全同步,一个方法是状态变量直接用作输出,称为输出编码的状态指定;在输出逻辑后再加一组与时钟同步的输出流水线寄存器,称为流水线化的输出(pipelined outputs)。

12.3 Verilog描述状态机

状态编码:独热码、gray码。对于FPGA实现的有限状态机建议采用独热码。(多用两个触发器,但组合电路省一些,电路速度和可靠性有显著提高,总的单元数并无显著增加)

高速状态机中常将输出直接指定为状态码,这样可以提高输出信号的开关速度并节省电路器件,缺点是开关维持时间必须与状态维持的时间一致。

//例12.3
//state最高位最低位作为输出,需增加状态
module fsm(clk, rst, A, k2, k1, state);
input             clk, rst, A;
output            k2, k1;
output reg [4:0]  state;
​
assign k2 = state[4];
assign k1 = state[0];
​
parameter idle       = 5'b0_000_0,
          start      = 5'b0_001_0,
          stop       = 5'b0_010_0,
          stop2clear = 5'b1_100_0,
          clear      = 5'b0_101_0,
          clear2idle = 5'b0_011_1;
always @(posedge clk) begin
  if(rst) begin
    state <= idle;
  end
  else
    case(state)
      idle:  if (A) state <= start;
             else   state <= idle;
      start: if(!A) state <= stop;
             else   state <= start;
      stop:  if(A)  state <= stop2clear;
             else   state <= stop;
      stop2clear:   state <= clear;
      clear: if(A)  state <= clear2idle;
             else   state <= clear;
      stop2clear:   state <= idle;
      default:      state <= idle;
    endcase
endendmodule

思考题

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

    例如采用独热码和gray码进行状态分配。对FPGA实现的状态机建议独热码,虽多用两个触发器,但所用组合电路节省,电路速度和可靠性有显著提高,而总的单元数无显著增加,采用独热码有多余的状态,会有一些不可达到的状态,用默认项(default)表示。

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

    非阻塞赋值表示过程块结束后进行赋值,是并行结构;阻塞赋值表示立即赋值,是顺序结构。==表示判断是否相等。

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

    状态变量表示状态机的状态,可以对不同状态转换;可以;好处是可以提高信号开关速度并节省电路器件,缺点是开关的维持时间必须与状态机的时间一致。

  4. 分析[例12.1]~[例12.4]中用Verilog编写的状态机模块。经综合后产生的电路结构中,哪个属于Mealy状态机?哪个属于Moore状态机?请在认真分析及综合出来的电路结构后,给出正确的答案。

    例12.1、12.2、12.4属于mealy状态机;12.3属于moore状态机。

  5. 如果需要设计带流水线输出的Mealy状态机,其Verilog模块应该如何编写?并通过综合器产生电路结构,分析其电路结构和时序。

    同例12.2;电路结构由数据选择器构成,输出通过寄存器输出,构成流水线。

  6. 在状态机的测试模块中,最后面的initial块语句有什么作用,若测试模块中没有最后的initial语句块能不能进行仿真?如果能,需要注意什么?本测试模块还有什么地方没有测试到?应该如何改进?

    和其他模块并行执行,设定仿真结束时间;能,要注意;未测试当状态不属于四个状态时,会怎样;初始化时可以先将rst信号设为高阻或者xx再按照测试模块仿真。

第13章 设计可综合的状态机的指导原则

13.4 语言指导原则

always块

  • 每个always块只能有一个事件控制,要紧跟关键字后

  • 可以表示时序逻辑或组合逻辑,不推荐表示电平敏感的透明锁存器同时表示组合逻辑

  • posedge/negedge表示沿触发

  • 每个时序always块只能由一个时钟跳边沿触发,置为/复位最好也由该时钟跳边沿触发

  • 避免组合反馈电路

赋值

  • 对寄存器型(reg)和整型(integer)变量赋值,只允许在一个always块内进行

  • 某信号赋为'bx,综合器解释成无关状态,为其生成的硬件电路简洁

思考题

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

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

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

    大多数综合器不能综合异步状态机;异步状态机的状态转移不是由唯一的时钟跳边沿触发,采用异步状态机不容易判别触发脉冲是正常的触发还是竞争冒险产生的毛刺。

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

    在生成组合逻辑的always块中参与赋值的所有信号都必须有明确的值;赋值表达式右端引用了敏感电平列表里没有列出的信号,综合时将会为该信号产生一个透明锁存器。

  4. 标准的可综合的带同步复位端的同步状态机的样板模块。

    always @(posedge clk) begin
        if (rst) begin
            //置输出为0     
        end
        else begin
            //时钟同步逻辑
        end
    end
  5. 标准的可综合的带异步复位端的同步状态机的样板模块。

    always @(posedge clk or posedge rst) begin
        if (rst) begin
            //置输出为0     
        end
        else begin
            //时钟同步逻辑
        end
    end
  6. 这两种不同的同步状态机有什么不同?如果输入的复位脉冲很窄,哪种状态机不能可靠复位?

    异步复位端的同步状态机复位与时钟无关;同步复位端的同步状态机只在时钟有效跳边沿复位;输入复位脉冲很窄,同步复位端的同步状态机不能可靠复位。

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

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

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

    编写另一个模块,在该模块中使用另一个时钟,通过实例引用连接模块;能够综合;仿真时尽量使两个状态机的时钟有一定联系。

第14章 深入理解阻塞和非阻塞赋值的不同

14.2 Verilog模块编程要点

可综合风格原则,在综合布局布线后的仿真中避免竞争冒险现象。

  1. 时序电路建模时,用非阻塞赋值;

  2. 锁存器电路建模时,用非阻塞赋值;

  3. 用always块建立组合逻辑类型时,用阻塞赋值;

  4. 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值;

  5. 不要在同一个always块中同时使用阻塞和非阻塞赋值;

  6. 不要在一个以上的always块中为同一个变量赋值;

  7. 用$strobe系统任务来显示,应用非阻塞赋值的变量值;

  8. 赋值时不要使用#0延迟。

14.3 Verilog的层次化事件队列

层次化事件队列在逻辑上分为用于当前仿真时间的4个不同的队列,和用于下一段仿真时间的若干个附加队列。

  1. 动态事件队列(下列事件执行顺序可随意安排):

    • 阻塞赋值

    • 计算非阻塞赋值语句右边表达式(RHS)

    • 连续赋值

    • 执行$display命令

    • 计算原语的输入输出变化

  2. 停止运行的事件队列:#0 延时阻塞赋值

  3. 非阻塞事件队列:更新非阻塞赋值语句LHS值

  4. 监控事件队列:

    • 执行$monitor命令

    • 执行$strobe命令

  5. 其他指定的PLI(Verilog Program Language Interface, Verilog代码调用C/C++函数的机制)命令队列:其他PLI命令

14.12 非阻塞赋值误解

非阻塞语句的赋值在所有的$display命令执行后更新数值。

initial $monitor("\$monitor: a = %b", a);
initial begin
    $strobe("\$strobe: a = %b", a);
    a = 0;
    a <= 1;
    $display("\$display: a = %b", a);
    #1 $finish;
end
/*输出结果
$display: a = 0
$monitor: a = 1
$strobe: a = 1
*/

#0延时将赋值事件强制加入停止运行事件队列中。

对同一个always块中,可以对某一变量进行多次非阻塞赋值,但只有最后一次赋值对该变量起作用。

思考题

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

    阻塞赋值。

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

    非阻塞赋值。

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

    可能会导致竞争冒险。

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

    非阻塞语句的赋值在所有的$display命令执行后才更新数据。

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

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

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

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

  7. 为什么在可综合 Verilog 模块的设计中,必须注意并遵守本章的8条原则?

    有助于正确编写可综合硬件,可消除90%~100%在仿真时可能产生的竞争冒险现象。

第15章 较复杂时序逻辑电路设计实践

思考题

  1. 在计算机上对[例15.1]进行RTL级仿真和综合后的门级 Verilog网表仿真。观测两种层次的仿真输出波形有什么不同,试着说明为什么出现不同。分析实际电路的波形应该如何?

  2. 把[例15.1]改写成能对1110001序列进行检测。在接下去的检测中不再考虑已经检出序列中的任何位。编写完整的 Verilog程序,并进行综合后的门级 Verilog网表仿真。当出现以上序列时,让Z的高电平维持两个节拍。

  3. 把[例15.2]改写成能对两位并行数据处理的电路。把两位并行数据转换为符合协议的串行数据,来控制4条输出线的电平。编写完整的Verilog程序,并进行综合后的门级Verilog网表仿真,验证设计的正确性。

  4. 把[例15.2]改写成能对三位并行数据处理的电路。把三位并行数据转换为符合协议的串行数据,来控制8条线的电平。但要求并串转换模块能在rst信号有效后,发出ack信号到信号源模块,然后由信号源模块发出数据(data[2:0]),编写完整的verilog程序,并进行综合后的门级Verilog网表仿真,验证设计的正确性,并编写出实验总结报告。

  5. [例15.2]中的out16hi模块布局布线后仿真如果要输出正确结果,为什么必须使从上一个模块ptosda输出的sda高阻状态变为一个固定的输出后才有可能得到结果,否则没有正确的电平输出;而RTL级仿真和综合后的verilog网表(即out16hi.vm)仿真却能得到正确的答案?请以该例仿真运行中发现的问题写出进行布线后仿真必须注意的几个重要因素。

第16章 复杂时序逻辑电路设计实践

二线制I2C CMOS串行EEPROM:一种采用CMOS工艺制成的串行可用电擦除可编程随机读写存储器。(IIC/I2C/I²C, Inter Integrated Circuit)

思考题

  1. 什么是同步状态机?

    所有触发器时钟端都连接在一个共同的时钟信号上,状态的改变只可能发生在时钟跳变沿上。

  2. 设计有限同步状态机的一般步骤是什么?

    逻辑抽象,得出状态转换图;状态简化;状态分配;选定触发器的类型并求出状态方程、驱动方程和输出方程;按照方程得出逻辑图。

  3. 为什么说把具体问题抽象成嵌套的状态机的思考方式可以处理极其复杂的逻辑关系?

    可以充分发挥硬件描述语言的抽象建模能力,使用always块和case等条件语句及赋值语句即可完成,具体的逻辑简化、逻辑电路到触发器的映射可由计算机自动完成。

  4. 为什么要用同步状态机来产生数据流动的开关控制序列?

    运算可以由组合逻辑实现,但运算的输入必须有一段时间才能得到稳定的输出,输出要作为下一阶段的输入,也必须有一段时间稳定,因此输出的结果必须保存在寄存器组中。对寄存器之间数据流动进行精确的控制,在算法实现过程中有极其重要的作用,这种控制由同步状态机实现。

  5. 什么是HDL RTL级的描述方式?它与行为描述方式有什么不同?

    RTL级描述数据在寄存器之间流动和如何处理这些数据的模型;行为级描述方式包含RTL级描述方式,且更加直观。

  6. 什么是综合?为什么要编写可综合模块?

    综合就是软件把HDL语言转化成具体的电路网表;用来替代实际电路进行仿真。

  7. 在设计中可综合模块和行为模块的作用分别是什么?

    可综合模块主要用来替代实际电路;行为模块用于产生仿真测试信号,以验证电路功能,也可以用于复杂数字系统的顶层设计。

  8. 可综合的Verilog HDL RTL级的描述方式的样板是什么?

    只能用同步状态机触及。

  9. 用RTL级描述方式的Verilog HDL模块是否都能综合?保证能综合的要点是什么?

    不是;

    1. 综合之前一定要仿真;

    2. 每一次布局布线之后都要进行仿真,在器件编程或流片之前要做最后的仿真;

    3. 用Verilog HDL描述的异步状态机是不能综合的,避免使用综合器设计,一定要用异步状态机,可用电路图输入的方法设计;

    4. 为电平敏感的锁存器建模,连续赋值语句是最简单的办法。

  10. 可综合的Verilog HDL RTL级模块的编写中,用阻塞赋值和非阻塞赋值的原则是什么?

    1. 时序电路建模,用非阻塞赋值;

    2. 锁存器电路建模,用非阻塞赋值;

    3. always块写组合逻辑时,用阻塞赋值;

    4. 在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值;

    5. 在同一个always块中不要同时使用阻塞赋值和非阻塞赋值;

    6. 不能在多个always块中为同一个变量赋值;

    7. 用$strobe系统任务来显示非阻塞赋值的变量值;

    8. 赋值时不要使用#0延迟。

  11. 保证可综合模块RTL和布线后仿真一致性的关键是什么?

    按照可综合指导原则编码。

第17章 简化的RISC_CPU设计

 

第18章 虚拟器件/接口、IP和基于平台的设计方法及其在大型数字系统设计中的作用

思考题

  1. 为什么要设计虚拟模块?

    为确保复杂系统设计能赶上瞬息万变的市场变化和逻辑设计的精确,并提高一次流片的成功率,降低设计和制造成本。

  2. 虚拟模块有几种类型?

    设计IP和验证IP。

  3. 为什么在ASIC设计中要尽量利用商业化的虚拟模块和IP技术?

    商业化的虚拟模块有着严格的要求,不但要求在系统设计的仿真中能完全替代真实的器件,而且还希望能够提示产生错误的原因。虚拟模块的精确与否,直接决定设计的成败。

    ASIC的投片成本很高,编写虚拟模块时任何小的疏忽都有可能造成投片的失败,造成大量资金的浪费。因此,编写这样的模块是一件复杂而细致的工作,需要极其认真的工作态度和作风,必须认真对待。只有在没有办法得到商业化的虚拟模型时,才利用器件手册来编写虚拟模块,因为编写精确的虚拟模块需要花费很多的时间和精力。

  4. 为什么说编写完整精确的虚拟模块,编写者不但需要全面熟练地掌握Verilog语言,还需要有高度的责任性,并且需要有一个严格的质量保证体系来确保与工艺的电路的一致性?

    因为编写地虚拟模块必须严格按照数据手册描述地波形编写,信号间地时间关系也必须完全符合手册要求,这样才能起到虚拟模块的作用,才能代替实际器件。同时,虚拟器件还要能对不符合要求的输入信号产生错误提示。虚拟模型的精确与否,直接影响到设计是否能够一次投片成功。SIC的投片成本很高,编写虚拟模块时任何小的疏忽都有可能造成投片的失败,造成大量资金的浪费。

  5. 什么是基于平台的设计方法学,为什么该设计方法具有最高的设计效率?

    把尽可能多的重复使用的设计资源集中到一个统一的平台上,供设计人员选用。只有依赖这样一个平台,才能高效率、低成本地完成复杂SoC系统地设计和验证,以及优化,为SoC地成功投片提供保障。

    它是基于处理器利用现成集成电路地实现方式,而不再需要专门设计很多定制电路,直接利用计算机平台自动生成远比由通用处理器芯片和通用外围集成电路芯片构成地线路板性能/价格比更好地SoC芯片。 

 

posted @ 2022-03-14 16:15  Strange9  阅读(968)  评论(0)    收藏  举报