从C语言发展而来,区别于C,Verilog HDL 是并行执行的。
逻辑值
0:逻辑低电平
1:逻辑高电平
z:高阻态
x:未知逻辑电平(实际中不存在x,而存在亚稳态(不是0也不是1))
关键字
example.v
module example
(
input wire sys_clk ,
input wire sys_rst_n ,
inout wire sda ,
output wire po_flag
);
//线网型变量
wire [0:0] flag ;
//寄存器型变量
reg [7:0] cnt ;
//参数
parameter CNT_MAX = 100;
localparam CNT_MAX = 100;//不能实例化
//模块实例化
example
#(
.CNT_MAX (8'd100 )
)
always(posedge sys_clk or negedg sys_rst_n)
if(syys_rst_n == 1'b0)
cnt <= 8'd0;
assign po_flag = (cnt==CNT_MAX) ? 1'b1 :1'b0; //就是三目运算
endmodule
常量
基数表示法
格式: [ 换 算 为 二 进 制 后 位 宽 长 度 ] [ ′ ] [ 数 值 进 制 符 号 ] [ 与 数 值 进 制 符 号 对 应 的 数 值 ] [换算为二进制后位宽长度]['][数值进制符号][与数值进制符号对应的数值] [换算为二进制后位宽长度][′][数值进制符号][与数值进制符号对应的数值]
[数值进制符号]中,h十六进制,o八进制,b二进制,d十进制
[换算为二进制后位宽长度]可有可无,Verilog会自动匹配(左边补0或截断左边位数)
若直接写,默认十进制
8'hab//表示位宽8bit,十六进制数ab
赋值方式
-
阻塞赋值
= //顺序执行 begin a = b; c = a; end
-
非阻塞赋值
<= //并行执行 begin a <= b; c <= a; //c等于a的初始值 end
算数运算符
+
-
* 一般不使用
\ 一般不使用
% 取余数
归约运算符、按位运算符
&
~&
^
~^
|
~|
//例如&有两种用途,一元运算符、二元运算符
&4'b1101 = 1'b0 //一元
4'b1101&4'b1001 = 4'b1001 //二元
逻辑运算符
&&
||
==
!=
关系运算符
<
>
<=
>=
移位运算符
<< //二进制左移1位表示乘以2,要注意位宽的拓展
>> //二进制右移1位表示除以2
位拼接运算符
{ ,}
//将8位a,3位b,5位c 拼接为 16位d
d = {a,b,c};
条件运算符
? :
优先级
规约>算数>移位>关系>’==和!=’>按位>’’&&和||’’>条件
一元运算符 > 二元运算符 > 三元运算符
语句
if()
;
else if()
;
else
;
case()
x1:y1; //当执行了某一分支项内语句后,就会跳出case。
default: yn;
endcase
系统函数
Verilog语言中预先定义了一些任务和函数,用于完成一些特殊的功能,被称为系统任务和系统函数,函数大多只能在Testbench仿真中使用,方便我们进行验证。
`timescale 1ns/1ns //时间尺度预编译指令,时间单位/时间精度
#数字//表示延时响应时间单位的时间,#10表示延时10个单位的时间
`timescale 1ns/10ps //精度0.01,#10.11表示延时10110ps
$display //打印信息,自动换行
$write //打印信息
$strobe //打印信息,自动换行,最后执行(在程序的最后面执行)
$monitor //监测变量
$stop //暂停仿真
$finish //结束仿真
$time //时间函数
$random //随机函数
$readmemb //读文件函数,二进制