Verilog 基础语法合集

模块定义:

module 模块名 (输入, 输出)  

endmodule;

信号声明:

wire/reg 信号名;

输入声明:

input 信号名;

输出声明:

output 信号名;

内部寄存器声明:

reg 信号名;

连接声明:

assign 信号名 = 表达式;

注释:

// 注释内容

多行注释:

/* 注释内容 */

位宽指定:

[位宽-1:0] 信号名;

立即赋值:

信号名 = 值;

常量定义:

parameter 常量名 = 值;

时钟信号:

always @(posedge 时钟信号)

信号延迟:

#时间单位 延迟时间;

选择结构:

if (条件) 
begin ... end

选择结构(多条件):

if (条件1) 
    begin ... end 
else if (条件2) 
    begin ... end

分支结构:

case (信号) 
    ... 
endcase

循环结构:

for (变量声明; 条件; 迭代) 
    begin 
        ... 
    end

延迟循环:

repeat (次数) 
    begin 
        ... 
    end

条件循环:

while (条件) 
    begin 
        ... 
    end

无限循环:

forever 
    begin 
        ... 
    end

运算符:

算术运算符:
+:加法运算或者正值运算,a+b、+a
— :减法运算或者负值运算:a—b、—a
* :乘法运算:a*b
/ :除法运算:a/b
% :求余运算:a%b,%两侧的数据必须为整型数据;

位运算符:
~ :按位取反   	 	 a=1001   ~a=0110
& :按位与   	 	 a=1001   b=0001   a&b=0001
| :按位或      	 	 a=1001   b=0001   a|b=1001
^ :按位异或	     	 a=1001   b=0001   a^b=1000
^~ :按位同或(异或非) a=1001   b=0001   a^~b=0111

逻辑运算符:
&&:逻辑与:a&&b,a和b同时为真时才为真,否则为假
||:逻辑或:a||b,a和b同时为假时才为假,否则为真
! :a为真时,!a为假

条件运算符:
assign  a = (b)?4'b1:4'b0; 如果b为真,那么a = 4'b1,否则a = 4'b0

关系运算符:
a < b  :a小于b
a > b  :a大于b
a == b :a等于b
a != b :a不等于b
a <= b :a小于或等于b
a >= b :a大于或等于b

移位运算符:
 reg [3:0] a,c;
 reg [5:0] b;
 a = 4'h1001;
 b = a<<2;    此时b=6'h100100
 c = a>>2;    此时c=4'h0010
左移位数增加,右移位数不变

位拼接运算符:
a = 4'h1101;
b = 6'h111000;
c = 2'h11;
d = {a[3],b[2:0],c};此时d = 100011
e = {2{b}};          此时e = {b,b} = 111000111000
f = {a,b,2{a,c}}     此时f = {a,b,a,c,a,c} = 111111000110111110111

数字赋值:

'b  二进制值
'h  十六进制值
'd  十进制值

高阻态:

tri/wire 信号名;

模块实例化:

模块名 实例名 (.端口(信号));

延迟控制:

#时间单位 延迟时间 语句;

延迟设定:

`timescale 时间单位/时间精度

初始块:

initial 
    begin 
        ... 
    end

模块实例输入连接:

.端口名(信号名)

模块实例输出连接:

.端口名(信号名)

阻塞赋值:

信号名 = #时间单位 延迟时间 表达式;

非阻塞赋值:

信号名 <= 表达式;

初始化赋值:

reg 信号名 = 值;

分隔符:

\n ;

局部参数:

localparam 参数名 = 值;

模块实例数组:

模块名 #(参数值) 实例名 (端口连接);

模块端口声明:

(.端口名(信号名))

模块实例化数组:

模块名 #(参数值) 实例名 [数组大小] (.端口(信号));

任务声明:

task 任务名 (输入);

任务调用:

任务名 (参数);

函数声明:

function 返回类型 函数名 (输入);

函数调用:

函数名 (参数);

阻塞延迟:

#时间单位 延迟时间;

非阻塞延迟:

#时间单位 延迟时间;

拉高信号:

force 信号名 = 值;

拉低信号:

release 信号名;

引用库:

`include "文件名"

阻塞语句:

@(敏感信号) 语句;

无条件停止:

$stop;

显示变量值:

$display("文本 %d", 变量);

模块输入输出声明:

input/output/wire/reg [位宽-1:0] 信号名;

延迟块:

#时间单位 
begin 
    ... 
end

分号运算符:

表达式1; 表达式2;

空操作符:

;

等待信号改变:

wait (信号);

强制停止:

$finish;

阻塞式循环:

for (变量声明; 条件; 迭代) 
    begin 
        ... 
    end

随机数生成:

$random;

选择结构(优先级):

unique case (信号) 
            ... 
        endcase

分支结构(不完全):

casex (信号) 
    ... 
endcase

分支结构(完全):

casez (信号) 
    ... 
endcase

常量宏定义:

`define 常量名 值

条件编译:

ifdef 宏名 ... endif

整数类型:

integer

实数类型:

real

字符类型:

byte

字符串类型:

string

扩展系统函数库:

`include "svlib.sv"

不可变信号:

input wire 信号名;

强制块:

force -drive/-load 信号名 = 值;

解除块:

release -drive/ -load 信号名;

分层模块实例:

模块名 模块实例名 (.端口名(模块实例名.端口名));

信号维持:

always @* 信号名 = 表达式;

你可能感兴趣的:(fpga开发)