verilog_grammar
语言要素
命名规则
标识符用来命名信号、模块、参数等,可以是一组字母、数字、$符号和下划线的组合
注释
单行注释以“//”开始
多行注释从“/”开始,到“/”结束
多行注释不能嵌套,单行注释可以嵌套在多行注释中
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}};