语言要素

命名规则

标识符用来命名信号、模块、参数等,可以是一组字母、数字、$符号和下划线的组合

注释

单行注释以“//”开始

多行注释从“/”开始,到“/”结束

多行注释不能嵌套,单行注释可以嵌套在多行注释中

verilog中的关键字

用小写

and always assign beign buf
bufif0 bufif1 case casex casez
cmos deassign default defparam disable
edge else end endcase endfunction
endprimitive endmodule endspecify endtable endtask
event for force forever fork
function highz0 highz1 if ifnone
initial inout input integer join
large macromodule medium module nand
negedge nor not notif0 notif1
nmos or output parameter pmos
posedge primitive pulldown pullup pull0
pull1 rcmos real realtime reg
release repeat rnmos rpmos rtran
ttrailif0 rtranif1 scalared small specify
specparam strength strong0 strong1 supply0
supply1 table task tran tranif0
tranif1 time tri traind trior
trireg tri0 tri1 vectored wait
wand weak() weak1 while wire
wor xnor xor
数值
状态 含义
0 低电平/逻辑0/假
1 高电平/逻辑1/真
x/X 不确定或者未知的逻辑状态
z/Z 高阻态

在数值中,“_”除了不能放在首位,可以随意用在整数或者实数,没有实际含义

整数表示
数制 基数符号 数字字符集
二进制 b/B 0、1、x、X、z、Z、?、_
八进制 o/O 0~7、x、X、z、Z、?、_
十进制 d/D 0~9、_
十六进制 h/H 0~9、a~f、A~F 、x、X、z、Z、?、_

表示形式:+/-<size>'<base_format><number>

4'b00``
7'd32
8'hfd
字符串表示

只能在同一行之中表示,不能分行书写

数据类型

线网型

表示硬件单元之间的物理连线,如果没有驱动元件连接到wire变量,缺省值一般为”Z“

用assign赋值

wire data_out;
wire flag;

assign data_out=data_in;
assign flag=1'b1;
寄存器型

reg表示存储单元,它的数据会保持最后一次赋值,直到被改写。

reg默认初始值为不定值”X“,缺省是数据为1位

reg一般为无符号数,如果把负数赋值,则自动转换为二进制补码

reg data;
reg data1;

reg[4:0] data2;
存储器型

本质是寄存器型变量阵列,可以描述RAM,ROM存储器和reg文件

声明格式:

reg<range1><name_of_register><range2>

  • range1:存储器里面寄存器的位宽。缺省为1
  • range2:寄存器的个数,缺省时为1
  • name_of_register:变量名称列表。可以定义多个,哟个逗号隔开
reg [7:0] mem[255:0];
reg [15:0] mem2[27:0],reg1,reg2;

mem1[2]=0;
整数型

用Integer声明,不需要指明位宽,与编译器有关,一般为32bit,reg为无符号数,integer为有符号数

reg [31:0] data1;
reg [3:0] byte[7:0];
integer j;

always@* begin
    for(j=0;j<=3;j=j+1) begin
        byte1[j]=data[(j+1)*8-1:j*8];
    end
end
时间型

使用特殊的时间寄存器time型变量,对仿真事件进行保存,位宽一般为64bit。

调用系统函数$time获取仿真事件

time current_time;
initial begin
    #100;
    current_time=$time;
end
实数型

使用关键字real来声明,可以用十进制数或者科学计数法,声明实数不能带有范围。默认值为0.

把一个实数赋值给一个整数,只有整数部分会被保留。

real data1;
integer tmp;
initial begin
    data=2e3;
    data1=3.75;
end
initial begin
    tmp=data1;
end
参数型

表示常量,用关键字parameter声明,只能赋值一次,但是可以通过实例化的方式更改参数在模块中的值。

局部参数用localparameter声明,区别在于值不能改变。

当参数在本模块调用时,可以用localparam说明。

运算符

运算符 功能 优先级
!、~ 反逻辑、位反相 由高到低
*、/、% 乘、除、取模
+、- 加、减
<<、>> 左移、右移
<,<=,>,>=
==,!=,===.!==
& 按位与
^、^~ 按位异或/同或
| 按位逻辑或
&& 逻辑与
|| 逻辑或
?: if-else
算数运算符

+、-、*、/、%

关系运算符

<,<=,>,>=

相等运算符

==:只比较0、1

===:比较0、1、x、z

逻辑运算符(0,1)
  • 逻辑与(&&)
  • 逻辑或(||)
  • 逻辑非(!)
按位运算符
  • 按位取反(~)、

  • 按位与(&)

    & 0 1 X
    0 0 0 0
    1 0 1 X
    X 0 X X
  • 按位或(|)

    | 0 1 X
    0 0 1 X
    1 1 1 1
    X X 1 X
  • 按位异或(^)

    ^ 0 1 X
    0 0 1 X
    1 1 0 X
    X X X X
  • 按位同或(^~)

规约运算(0,1)
  • 规约与(&)
  • 规约与非(~&)
  • 规约或(|)
  • 规约或非(~|)
  • 规约异或(^)
  • 规约同或(~^)
移位运算符
  • 左移(<<)
  • 右移(>>)
  • 算术左移(<<<)
  • 算数右移(>>>):最高位补充符号位
连接运算符

用{,}表示多个操作数拼接成新的操作数。

拼接符操作数必须指定位宽

A=4‘b1010
B=1'b1
Y1={B,A[3:2],A[0],4'h3};
Y2={4{B},3'd4};
Y3={32{1'b0}};