Verilog语法基础
FPGA语法
逻辑值:
0:逻辑低电平,条件为假。
1:逻辑高电平,条件为真。
z:高阻态,无驱动
x:未知逻辑电平,这既不是0也不是1,只是一个不稳定的状态。
关键字:
module
:表示模块的开始,后边紧跟模块名,模块名一般跟.v文件一致,模块结束使用endmodule
。
输入输出信号:input
输入、ouput
输出、inout
输入输出。
变量:
wire
线网型变量:看作是直接的连接,在可综合逻辑中,被映射为真实的物理连线。reg
寄存器型变量:具有对某一时间点状态进行保持的功能,在可综合逻辑中,被映射为真实的物理寄存器。
参数:
parameter
:在顶层文件可以通过实例化对这种类型参数进行修改。localparam
:只能在模块内部使用,不能实例化。
常量:
- 格式:[换算为二进制后位宽的总长度]['][数值进制符号][与数值进制符号对应的数值],例如
8'd171
:位宽为8bit,十进制的171。[h]表示十六进制,[o]表示八进制,[b]表示二进制。[换算为二进制后位宽的总长度]可有可无,verilog会为常量自动匹配合适的位宽,总位宽大于实际位宽时,则自动左边补0,总位宽小于实际位宽,则自动截断左边超出的位数。
赋值方式 :
- 阻塞赋值
=
:每条语句执行完后再执行下一条语句。
a = 1;
b = 2;
c = 3;
begin
a = b;
c = a;
end
//结果
a = 2;
b = 2;
c = 2;
- 非阻塞赋值
<=
:语句并行执行。
a = 1;
b = 2;
c = 3;
begin
a <= b;
c <= a;
end
a = 2;
b = 2;
c = 1;
always
语句:在程序执行过程中一直在循环执行。括号内是敏感列表,下边表示sys_clk
上升沿或者sys_rst_n
下降沿到来时执行always
语句。
always (posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == l'b0)
cnt <= 8'd0; //初值为0
else if(cnt == CNT_MAX) //计数到最大参数时,就一直保持
cnt <= CNT_MAX;
else
cnt <= cnt + 8'd1; //否则就一直加1
assign
语句:连续赋值语句。相当于一条连线,将表达式右边的电路直接通过wire(线)连接到左边,左边信号必须是wire型,当右边信号变化了左边立刻发生变化。
wire a, b, y;
assign y = a & b;
综合结果图:
算数运算符
+,-,*,/,%。
归约运算符、按位运算符
- &作为一元运算符时,表示归约运算符,&m表示将m中所有的bit相与,最后结果为1bit。
- &4'b1111=1&1&1&1=1'b1
- 作为二元运算符时,表示按位与,与C语言一样。
逻辑运算符
&&、||
、==、!=,与C语言一样。
关系运算符
<、>、<=、>=。跟C语言一样。
移位运算符
左移符号<<,右移符号>>。跟C语言一样。
位拼接运算符:8bit的a,3bit的b,5bit的c按顺序拼接成一个16bit的d,表示方法为:d={a,b,c};
条件运算符:其实就是C语言的三目运算符。
优先级:归约运算符> 算术运算符>移位运算符>关系运算符> “==” 和“!=” > 按位运算符 > “&&” 和"||
" > 条件运算符。总的来说是一元运算符>二元运算符>三元运算符。不行就加()。
if-else条件分支语句:跟C语言一样
case分支控制语句:跟C语言一样
系统函数:****(先知道有这些函数,具体用的时候再搜)
预先定义了一些任务和函数,用于完成一些特殊的功能,它们被称为系统任务和系统函数,大多在Testbench仿真中使用,使我们更方便的进行验证。
timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度
时间单位和时间精度由1、10和100以及单位s、ms、us、ns、ps和fs组成。
时间单位:定义仿真过程中所有与事件相关量的单位。
仿真中使用#数字
表示延时响应时间单位的时间,例#10
表示延时10个单位的时间,即10ns。
时间精度:决定时间相关量的精度及仿真显示的最小刻度。
timescale 1ns/10ps
精度0.01,#10.11
表示延时10110ps
。就是10.11ns
=10110ps
下面这种写法就是错误的,因为时间单位不能比时间精度小。
timescale 100ps/1ns。
$display
函数:打印、输出,自动输出换行。
$display("%b+%b=%d",a,b,c);//%b、%d、%o、%h分别是二进制,十进制,八进制和十六进制。
$write
函数:打印、输出、不能自动输出换行。
$strobe
函数:打印、输出、但是只能在最后输出。
$monitor
函数:用于持续监测变量,监测的变量发生变化,它就执行一次。
$stop
、$finish
,暂停仿真、结束仿真。
$time
时间函数,返回64位当前仿真时间;$random
用于产生随机函数,返回随机数。
$readmemb
用于读二进制文件函数,$readmemh
用于读十六进制文件函数。