开坑:Verilog HDL学习 【2】

萌新小白,为做FPGA大创,开始学习Verilog HDL


基本概念

词法约定

  • 空白符:\b、\t等,在编译阶段被忽略

  • 注释符:

//单行注释 /*多行 注释*/

  • 操作符:

单目操作符:a=~b; 双目操作符:a=b&&c; 三目操作符:a=b?c:d;

  • 数字声明:

指明位数 <size>'<base format><number>:4'b1111 12'habc 16'd255

未指明位数:位宽于使用的计算机有关:23456(默认十进制) 'hcc 'o21

X和Z值: 12'h13x 6'hx 32'bz (16进制的时候XZ代表4位,8进制的时候代表3位,二进制时代表1位,如果最高位为1,则使用0扩展最高位,如果最高位为0,则用X或Z进行扩展)

负数:在数字声明前加‘-’:-6'd3 -6'sd3

下划线和问号:下划线只为提高可读性,?可以替代Z

  • 字符串

"Hello Verilog World"

  • 标识符和关键字

关键字全部小写,标识符以字母或者_开头

  • 转义表示符

以\开始,以空格结束

数据类型

  • 值的种类

值的类别:0、1、X、Z

当出现冲突时,按照强度等级判断最后的逻辑输出结果

强度等级

类型

supply

驱动

strong

驱动

pull

驱动

large

存储

weak

驱动

medium

存储

small

存储

highz

高阻

  • 寄存器

寄存器的声明和使用

reg reset;
initial
begin
reset=1'b1;
#100 reset=1'b0;
end

带符号寄存器

reg signed [63:0] m;
integer i;
  • 向量

声明向量时,括号左边不管什么数字,都为高位。wire [7:0] bus; reg [0:40] virtual_add;

向量域选择:bus[2:0]. virtual_add[0:1]

可变向量域选择:[<starting_bit>+/-:width] byte=data[31-:8];

  • 整数、实数、时间寄存器

integer、real、time

  • 数组

不同于向量,向量表示某个东西的结合而不是一个东西有几个方向,向量是一个单独的元件而数组是n个元件

wire [7:0] w_array2 [5:0]

赋值:array_4d[0][0][0][0][0:15]=0;

  • 存储器

reg mem1bit[]0:1023];
reg [0:7] membyte [0:1023];
  • 参数

parameter port_id=5; parameter signed [15:0] WIDTH;

  • 字符串

存储长度要大于实际长度,要不然会把左边的位截取

reg [8*18:1] string_value;
initial
string_value = "hello Verilog World";

系统任务和编译指令

$\( display:用来显示目前的一些变量的值; \)$dispay(p1,p2,p3,pn);

$\( monitor:动态监视; \)$monitor(p1,p2,p3,pn);

$stop:暂停仿真

$finish:结束仿真

`define:类似c里的#define,可以用来替换

`include:类似c里的#include,将一个源文件包含到另外一个文件中


书目参考:Verilog HDL数字设计与综合(第二版)[美] Samir Palnitkar