Verilog HDL是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。Verilog可以从五个层次对电路(系统)进行描述,包括:系统级、算法级、寄存器传输级(即RTL级)、门级、开关级。我们平时用的最多的为RTL级,故Verilog代码也经常被称为RTL代码。
Verilog, standardized as IEEE 1364, is a hardware description language used to model electronic systems. It is most commonly used in the design and verification of digital circuits at the register-transfer level of abstraction. It is also used in the verification of analog circuits and mixed-signal circuits, as well as in the design of genetic circuits. In 2009, the Verilog standard was merged into the SystemVerilog standard, creating IEEE Standard 1800-2009. Since then, Verilog is officially part of the SystemVerilog language. The current version is IEEE standard 1800-2017.
词法
// 注释 // 单行注释 /* 多行 注释 */ // 操作符 a = ~b; // 单目操作符,取反操作。 a = b && c; // 双目操作符, a = b ? c : d; // ?:是三目操作符,条件选择操作。 // 数字声明:<size>'<base format><number> a = 4'b1111; // 4位的二进制数。 a = 12'habc; // 12位的十六进制数。 a = 16'd255; // 16位的十进制数。 a = 23456; // 如果不指定位数,则位数与所使用的计算机相关。 a = 6'hx; // 6位的十六进制数,所有位不确定(x表示值不确定)。 a = 32'bz; // 32位的高阻值(z表示高阻值)。 // 字符串 a = "Hello World"; // 标识符与关键字 reg value; // reg是关键字,value是标识符。 input clk; // input是关键字,clk是标识符。
数据类型
// 线网 wire a = 1'b0; // 声明a是wire(连线)类型,并被赋值为逻辑值0。 // 寄存器 reg reset; // 声明能保持数值的变量reset; initial begin reset = 1'b1; // 把clk初始化为1,使数字电路复位。 #100 reset = 1'b0; // 经过100个时间单位后,reset置为0。 end // 向量:[high#:low#]或[low#:high#],左边的数总是代表向量的最高有效位。 wire a; // 标量线网变量。 wire [7:0] bus; // 8位总线。 wire [31:0] busA, busB, busC; // 3条32位宽的总线。 reg [0:40] virtual_addr; //向量寄存器,41位宽的虚拟地址,最高有效位是第0位。 busA[7]; // 向量busA的第8位。 bus[2:0]; // 向量bus的低3位。如果写成bus[0:2]是非法的,因为高位应该卸载范围说明的左侧。 virtual_addr[0:1]; // 向量virtual_addr的2个最高位。 // 整数 integer counter; // 一般用途的变量,作为计数器。 // 实数 real delta; // 定义一个名为delta的实型变量。 // 时间寄存器 time save_sim_time; // 定义时间类型的变量save_sim_time。 initial begin save_sim_time = $time; //把当前的仿真时间记录下来。 end // 数组 // 向量是一个单独的元件,位宽是n;数组是多个元件组成的,每个元件的位宽是n或1。 integer count[0:7]; // 由8个计数变量组成的数组。 reg bool[31:0]; // 由32个1位的布尔计数器变量组成的数组。 reg[4:0] port_id[0:7]; // 由8个端口标识变量组成的数组,端口变量的位宽是5。 integer matrix[4:0][0:255]; // 二维的整数型数组。 // 存储器 // 存储器是verilog中对RAM或ROM的建模,通常用寄存器的一维数组表示。 reg mem1[0:1023]; // 1K的1位存储器。 reg[7:0] mem2[0:1023]; // 1K的1字节存储器。 // 参数(常数) // verilog可以使用parameter在模块内定义常数。 parameter port_id = 5; // 定义常数port_id是5。 parameter signed [15:0] WIDTH; // 把参数WIDTH规定为有正负号,宽度为16位。 // 字符串 reg [8*18:1] string_value; // 声明变量string_value,宽度为18个字节。 initial begin string_value = "Hello World"; // 字符串可以存储在变量中。 end
系统任务
// 显示信息 // $display用于显示变量、字符串或表达式的主要系统任务,是常用的系统任务之一。 $display("Hello World"); reg port_id = 5'b00101; $display("ID of the port is %b.", port_id); // 显示为:ID of the port is 00101. // 监视信息 // $monitor用于对信号值变化进行动态监视。 initial begin $monitor($time, "Value of signals clock = %b, reset = %b.", clock, reset); // 输出如下: // 0 Value of signals clock = 0, reset = 1. // 5 Value of signals clock = 1, reset = 1. // 10 Value of signals clock = 0, reset = 0. end // 暂停 $stop; // 结束仿真 $finish; // 编译指令 `define WORD_SIZE 32; // 规定字长的文本宏,在代码中用`WORD_SIZE表示。 `include header.v; // 包含header.v文件,在该文件中有本文件代码需要的内容。标签:reset,变量,port,基本概念,语法,Verilog,time,reg From: https://www.cnblogs.com/vicky2021/p/17033649.html