过程块
Verilog 中的过程块(Procedural Block)可以使用 always 和 initial 关键字定义。always 关键字用于表示一个连续执行的过程,例如一个状态机的状态转移过程。而 initial 关键字用于表示一个只在模拟开始时执行一次的过程,例如对仿真环境进行初始化。
以下是 Verilog 过程块的语法示例:
always @ (posedge clk) begin
// 这里是过程块,使用阻塞赋值将输入信号赋值给 D 触发器q <= d;
end
initial begin
// 这里是过程块,用于对仿真环境进行初始化reset = 1'b1;
clk = 1'b0;
#10;
clk = 1'b1;
#10;
end
always @ (posedge clk) begin
// 这里是过程块,使用阻塞赋值将输入信号赋值给 D 触发器q <= d;
end
initial begin
// 这里是过程块,用于对仿真环境进行初始化reset = 1'b1;
clk = 1'b0;
#10;
clk = 1'b1;
#10;
end
在 always 关键字后面的括号中,需要指定一个敏感列表,用于定义过程块的触发条件。例如 (posedge clk) 表示只有时钟信号 clk 上升沿触发时才会执行该过程块。可以使用信号的上升/下降沿(posedge,negedge),也可以使用信号的跳变沿(任意沿,直接写信号名),可以多个信号混用,但不可以跳变沿和上升/下降沿混用。
在过程块的内部,可以使用 Verilog 的语句进行操作,例如赋值语句、分支语句、循环语句等等。例如上面的代码示例中,always 关键字定义的过程块使用了阻塞赋值语句将输入信号赋值给 D 触发器的输出。
initial 关键字用于定义模拟开始时需要执行的过程块,例如对仿真环境进行初始化。在 initial 关键字后面,可以编写任意数量的 Verilog 语句,例如赋值语句、延时语句等等。在上面的代码示例中,initial 关键字定义的过程块使用了赋值语句将复位信号 reset 和时钟信号 clk 初始化为特定值,并使用了延时语句 #10,表示模拟器需要等待 10 个时间单位才能执行下一条语句。
流程控制
Verilog 支持多种流程控制语句,包括条件语句、循环语句和跳转语句等。以下是一些常见的 Verilog 流程控制语句:
- 条件语句:Verilog 支持 if-else 和 case 语句用于根据不同的条件执行不同的操作。if-else 语句用于执行简单的条件判断,而 case 语句用于匹配多个可能的情况。
if (condition1) begin
// 这里是条件 1 的处理逻辑
end else if (condition2) begin
// 这里是条件 2 的处理逻辑
end else begin
// 这里是默认的处理逻辑
end
case (selector)
2'b00: begin
// 这里是 case 1 的处理逻辑
end
2'b01: begin
// 这里是 case2 的处理逻辑
end
default: begin
// 这里是默认的处理逻辑
end
endcase
if (condition1) begin
// 这里是条件 1 的处理逻辑
end else if (condition2) begin
// 这里是条件 2 的处理逻辑
end else begin
// 这里是默认的处理逻辑
end
case (selector)
2'b00: begin
// 这里是 case 1 的处理逻辑
end
2'b01: begin
// 这里是 case2 的处理逻辑
end
default: begin
// 这里是默认的处理逻辑
end
endcase
- 循环语句:Verilog 支持 for 和 while 语句用于实现循环操作。其中,for 语句可以在一个指定的范围内进行循环,而 while 语句则会一直循环直到条件不成立。
for (initialization; condition; update) begin
// 这里是循环体
end
while (condition) begin
// 这里是循环体
end
for (initialization; condition; update) begin
// 这里是循环体
end
while (condition) begin
// 这里是循环体
end
- 跳转语句:Verilog 支持 break 和 continue 语句用于跳出循环或跳过循环的某个迭代。此外,Verilog 还支持 return 语句用于从子程序中返回。
for (i = 0; i < 10; i = i + 1) begin
if(i == 5) begin
// 跳过 i=5 的循环迭代continue;
end
if(i == 8) begin
// 跳出循环break;
end
end
function intmy_function(input1, input2);
if (input1 == 0) begin
// 返回 0return1;
end
// 执行其他操作
endfunction
for (i = 0; i < 10; i = i + 1) begin
if(i == 5) begin
// 跳过 i=5 的循环迭代continue;
end
if(i == 8) begin
// 跳出循环break;
end
end
function intmy_function(input1, input2);
if (input1 == 0) begin
// 返回 0return1;
end
// 执行其他操作
endfunction
需要注意的是,Verilog 中的流程控制语句只能用于过程块中,不能用于模块声明和实例化中。在过程块中使用流程控制语句时,需要注意避免出现死循环或无法结束的情况。