Verilog 实例demo

用一个简单的例子来介绍verilog的用法

目录

  • TOC {:toc}

verilog概述#

Verilog能够在多种抽象级别对数字逻辑系统进行描述,Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。当前广泛使用的硬件描述语言包括VHDL以及Verilog HDL(VHSIC Hardware Description Language);同时verilog还衍生出了一些变种语言如System Verilog、Verilog-AMS等等,丰富了Verilog语言的应用场景。

不同语言在芯片设计上的主流场景

verilog语言和VHDL语言功能基本相同,在目前的项目上可以支持混用,但是VHDL的语法上更加严格一些,verilog语言更倾向于C语言,如果是入门学习,作者个人认为学习verilog语言就足够了,学完了Verilog语言基本就能看懂VHDL程序的意思。

实例#

话不多说,先看看verilog程序整什么样: Verilog程序一般分为程序和测试程序(一般习惯叫Testbench),测试程序会依据程序的功能尽可能的覆盖多的场景。

verilog程序实例#

// and2x模块:实现两个输入信号的与逻辑
module and2x(
    input a,  // 输入信号a
    input b,  // 输入信号b
    output r  // 输出信号r,等于a和b的与逻辑结果
);
    // 由于a和b已经定义为input,这里不需要再次定义wire
    // wire a, b, r; 这行代码是多余的,应该删除

    // assign语句将a和b的与逻辑结果赋值给输出r
    assign r = a & b;
endmodule

verilog testbench程序实例#

再看看verilog程序的测试程序长什么样子

`timescale 1ns / 1ps

module tb_and2x;

  // 定义信号
  reg a;
  reg b;
  wire r;

  // 实例化 and2x 模块
  and2x uut (
    .a(a),
    .b(b),
    .r(r)
  );

  // 测试过程
  initial begin
    // 初始化输入
    a = 0;
    b = 0;
    #10; // 等待 10ns

    // 测试第一个条件
    a = 1;
    b = 0;
    #10; // 等待 10ns

    // 测试第二个条件
    a = 0;
    b = 1;
    #10; // 等待 10ns

    // 测试第三个条件
    a = 1;
    b = 1;
    #10; // 等待 10ns

    // 测试结束
    $finish;
  end

  // 监控输出
//end    
  initial begin
    $dumpfile("out.vcd");
    // This will dump all signal, which may not be useful
    //$dumpvars;
    // dumping only this module
    //$dumpvars(1, testbench);
    // dumping only these variable
    // the first number (level) is actually useless
    $dumpvars(0, testbench);
end  

endmodule

verilog有什么用#

数字芯片设计流程

Verilog 语法篇

verilog语法的基本认识

目录

  • TOC {:toc}

前言#

verilog的语法入门篇

数据类型#

  • reg(寄存器):
    用于存储逻辑电路中的状态变量,可以通过赋值操作进行更新。其用法类似于其他编程语言中的变量,但不同的是,在 Verilog 中,reg类型的变量可以不仅可以存储数字和布尔值,还可以存储多位二进制数(也可以存储 ASCII 字符)。

  • integer(整数):
    用于存储整数类型的变量,可以进行加减乘除等基本算术运算。其范围为 -2^31 到 2^31 - 1。

  • real(实数):
    用于存储浮点数类型的变量,可以进行基本的算术运算和一些特殊的数学函数运算。其精度和范围可能因实现而异。

  • time(时间):
    用于存储时间类型的变量,可以表示电路中的时间间隔,通常以纳秒为单位。在仿真过程中,时间变量可以用于控制模拟过程的进行。

  • event(事件):
    用于在电路中表示事件,可以通过事件触发器(Event Trigger)来控制模块的行为。

  • parameter(参数):
    用于在模块内部定义常量,其值在模块实例化时被确定。在模块中,参数可以用于配置模块的行为。

除了上述的变量类型之外,Verilog 中还有其他一些变量类型,如bit、byte、logic等,它们的具体用法和特点可能略有不同。在实际设计中,可以根据需要选择和使用适当的变量类型来实现设计。

数值表示#

verilog是面向数字电路的编程语言,数值的表示更侧重于二进制的方式,和C语言会有一些区别。

数据种类#

Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑:

0:逻辑 0 或 “假”
1:逻辑 1 或 “真”
x 或 X:未知
z 或 Z:高阻

  • x 意味着信号数值的不确定,即在实际电路里,信号可能为 1,也可能为 0。
  • z 意味着信号处于高阻状态,常见于信号(input, reg)没有驱动时的逻辑结果。例如一个 pad 的 input 呈现高阻状态时,其逻辑值和上下拉的状态有关系。上拉则逻辑值为 1,下拉则为 0 。

数字声明时,合法的基数格式有 4 中,包括:十进制(’d 或 ‘D),十六进制(‘h 或 ‘H),二进制(‘b 或 ‘B),八进制(‘o 或 ‘O)。数值可指明位宽,也可不指明位宽。