Verilog语法简介
- 常量
正数常量 | 含义 |
---|---|
8’b11001100 | 宽度为8位的二进制数 |
8’hff | 宽度为8位的十六进制数 |
7’o15 | 宽度为7位的八进制数 |
6’d10 | 宽度为6位的十进制数 |
- 变量
- net型变量
net型变量相当于硬件电路中各种物料连接其特点是输出的值紧跟输入值的变化而变化。wire是最常用的net型变量。wire型信号可以用作任何表达式的输入,也可以作为assign语句和实例元件的输出。
- variable变量
variable型变量可以保存上次写入的数据,一般对应硬件上的一个触发器或锁存器等存储元件。在综合器综合的时候,会根据其被赋值的情况来具体确定是映射成连线还是映射为存储元件。
类型 | 含义 |
---|---|
reg | 比特数据 |
interger | 整数 |
real | 实数 |
- 向量
可以理解为变量的数组,示例
定义 | 含义 |
---|---|
wire [31:0] bus; | 32位的wire型向量,bus[31]是最高位,bus[0]是最低位 |
reg [31:23] pc; | 32位的reg型向量,其中pc[31]是最高位,pc[23]是最低位 |
- 运算符
运算符与C语言类似,这里挑几个特别的运算符
- 等式运算符“==“:参与比较的两个操作数必须逐位相等,其结果才为1.如果某些值是不定态X或高阻态Z,其结果是不定态X。等式“===”:参与比较的操作数中为不定态X或高阻态Z的位也进行比较,两个操作数必须完全一致,其结果才为1,否则为0。
- 位拼接运算符:{op1,op2}、{num{op}}、{num{op1},op2}…
- 过程语句
- always语句:不断重复执行的语句
always @(posedge clk) begin
else begin
data<=data_in;
end
end
- initial语句:只执行一次的语句,不可综合
- 赋值语句
- 持续赋值语句:assign,主要用于对wire型变量赋值。可理解为在电路中将线路直接连接。
- 过程赋值语句:在always、initial过程语句中的赋值语句称为过程赋值语句,多用于对reg型变量进行赋值,分为非阻塞赋值和阻塞赋值两种方式。
(1). 非阻塞赋值“<=”:非阻塞赋值在整个过程语句结束时才会完成赋值操作。
(2). 阻塞赋值“=”:阻塞赋值在该语句结束时就立即完成赋值操作。如果在一个块语句中,有多条阻塞赋值语句,那么在前面的赋值语句没有完成之前,后面的语句就不能被执行。
在always过程块中,非阻塞赋值可以理解为赋值语句是并发执行的,而阻塞赋值可以理解为赋值语句串行执行的。在一个过程块中,阻塞式赋值与非阻塞式赋值只能使用其中一种。
- 条件语句
条件语句有if-else、case两种
always @(posedge clock or posedge reset)begin
if(reset)begin
count<=0;
busy<=0;
busy2<=0;
end
end
always@(*)begin
case(m)
2'b00:out<=data_in1;
2'b01:out<=data_in2;
2'b11:out<=data_in3;
default: out<=32'b0;
endcase
end
- 循环语句
循环语句有四种:for、forever、while、repeat。除for语句可综合以外,其它都不可综合。
- 编译指示语句
(1). 宏替换
define (2).
include语句,不可综合
(3). 条件编译语句`ifdef、`else、`endif
实例代码:Verilog实现JK触发器
module JK_FF(
input CLK,
input J,
input K,
input RST_n,
output reg Q1,
output reg Q2
);
always @(posedge CLK or negedge RST_n) begin
if(~RST_n) begin
Q1<=0;
end
else begin
if(K&J) begin
Q1<=Q2;
end
else if(J) begin
Q1<=1;
end
else if(K) begin
Q1<=0;
end
end
end
always @ (Q1)
Q2 <= ~Q1;
endmodule