Verilog简介

触发器(flip-flop)之类的数字元件可以用诸如NAND和NOR之类的组合门来表示。 触发器的功能是通过以特定方式连接一组特定的门来实现的。 通常通过从真值表中求解K-map(卡诺图)来确定门的连接方式。 真值表不过是一个表,它告诉我们什么输入组合在一起以给出什么输出值。 下图显示了代表D型触发器和相应真值表的电子电路。 仅当rstn和d的值均为1时,输出q才变为1。
在这里插入图片描述

什么是硬件原理图(hardware schematic)?

硬件原理图是显示如何连接组合门以实现特定硬件功能的图。 在这种情况下,这是一组与非门连接,如上图左侧所示。 但是,如果我们知道输入的哪些值有助于使输出的值为1,则可以实质上隐藏连接的内部细节并将其封装到黑盒中。 该模块为我们提供了某些输入和输出,类似于由组合门组成的硬件原理图。

什么是硬件描述语言(Hardware Description Language)?

如果我们可以描述此块的行为方式,然后让软件工具将该行为转换为实际的硬件原理图,将会更加容易。 描述硬件功能的语言称为Verilog,并且被分类为硬件描述语言。

设计功能是什么意思?

D触发器的一些典型行为要求为:
【1】时钟应该是触发器的一个输入;
【2】如果复位信号(rstn=0)为0,那么触发器应该复位(输出q=0);
【3】如果复位信号(rstn=1)为1,那么触发器的输出q跟随d的值;
【4】输出“ q”应仅在时钟有效沿获得新值;
一个重要的问题:我们如何知道Verilog中描述的行为是否准确反映了设计的预期行为?

什么是验证(verification)?

这可以通过不同的方法进行检查,并统称为验证。 验证的最普遍和广泛实践的方法是电路仿真。 有一些软件工具可以了解Verilog中描述的硬件应如何工作并为设计模型提供各种输入刺激。 然后对照预期值检查设计的输出,以查看设计在功能上是否正确。

所有仿真均由EDA(电子设计自动化)软件工具执行,Verilog设计RTL放置在称为testbench。 在测试平台内,各种测试为设计提供了不同的刺激。 下图显示了这样的测试平台。
在这里插入图片描述

Verilog代码部分

所有行为代码都应在关键字module和endmodule中描述。其余的设计代码将大部分遵循给定的模板。

Verilog部分模板

【1】模块定义和端口列表声明;
【2】输入和输出端口列表;
【3】使用允许的Verilog数据类型声明其他信号;
【4】设计可能依赖于其他Verilog模块,因此它们的实例是通过模块实例化创建的;
【5】描述此模块行为实际Verilog设计;

module [design_name] ( [port_list] );
 
  [list_of_input_ports]
  [list_of_output_ports]
 
  [declaration_of_other_signals]
 
  [other_module_instantiations_if_required]
 
  [behavioral_code_for_this_module]
endmodule

下面显示的代码描述了D型触发器的行为。 前几行声明了一个名为dff的新模块,并定义了输入和输出端口。 此设计中使用的唯一其他信号是q,然后声明。 由于这是一个简单的设计,因此它不依赖于任何其他模块,因此没有模块实例化。 Always块描述了硬件在某些事件中应如何表现,因此是行为代码

// “ dff”是此模块的名称
 
module  dff  (   input   d,       // Inputs to the design should start with "input"
            rstn,
            clk,
        output  q);     // Outputs of the design should start with "output"
 
  reg q;               //声明一个变量以存储输出值
 
  always @ (posedge clk) begin   // 该块在clk 0-> 1的上升沿执行
    if (!rstn)          // 在posege上,如果rstn为0,则q应该为0
      q <= 0;
    else 
      q <= d;         // 在posege上,如果rstn为1,则q应该为d
  end
endmodule               // 模块结束

测试平台代码

测试平台是Verilog容器模块,它使我们可以使用不同的输入来驱动设计并监视其输出以获取预期的行为。 在下面显示的示例中,我们实例化了上面说明的触发器设计,并将其与tb_ *表示的测试平台信号相连。 然后为这些测试台信号分配某些值,并最终将其作为设计的输入驱动。

module tb;
 
  // 1.声明输入/输出变量以驱动设计
  reg   tb_clk;
  reg   tb_d;
  reg   tb_rstn;
  wire   tb_q;
 
  // 2.创建设计实例
  // 设计实例化
  dff   dff0 (   .clk   (tb_clk),     // 将时钟输入与TB信号连接
          .d     (tb_d),   
          .rstn   (tb_rstn),    
          .q     (tb_q));    
 
  // 3. 以下是刺激的例子
  // 在这里,我们以特定值驱动信号tb_ *
  //由于这些tb_ *信号已连接到设计输入,因此将使用tb_ *中的值来驱动设计
  initial begin
    tb_rsnt   <=   1'b0;
    tb_clk     <=   1'b0;
    tb_d     <=  1'b0;
  end
endmodule

参考文献:
【1】https://www.chipverify.com/verilog/verilog-introduction#testbench-code

发布了124 篇原创文章 · 获赞 8 · 访问量 6693

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104533179