赞
踩
顺序块用关键字 begin 和 end 来表示。
顺序块中的语句是一条条执行的。当然,非阻塞赋值除外。
顺序块中每条语句的时延总是与其前面语句执行的时间相关。
在本节之前的仿真中,initial 块中的阻塞赋值,都是顺序块的实例。
并行块有关键字 fork 和 join 来表示。
并行块中的语句是并行执行的,即便是阻塞形式的赋值。
并行块中每条语句的时延都是与块语句开始执行的时间相关。
`timescale 1ns/1ns module test ; reg [3:0] ai_sequen, bi_sequen ; reg [3:0] ai_paral, bi_paral ; reg [3:0] ai_nonblk, bi_nonblk ; //============================================================// //(1)Sequence block initial begin #5 ai_sequen = 4'd5 ; //at 5ns #5 bi_sequen = 4'd8 ; //at 10ns end //(2)fork block initial fork #5 ai_paral = 4'd5 ; //at 5ns #5 bi_paral = 4'd8 ; //at 5ns join //(3)non-block block initial fork #5 ai_nonblk <= 4'd5 ; //at 5ns #5 bi_nonblk <= 4'd8 ; //at 5ns join endmodule
仿真波形:
顺序块和并行块还可以嵌套使用。
`timescale 1ns/1ns module test ; reg [3:0] ai_sequen2, bi_sequen2 ; reg [3:0] ai_paral2, bi_paral2 ; initial begin ai_sequen2 = 4'd5 ; //at 0ns fork #10 ai_paral2 = 4'd5 ; //at 10ns #15 bi_paral2 = 4'd8 ; //at 15ns join #20 bi_sequen2 = 4'd8 ; //at 35ns end endmodule
在顺序块中的并行块,其时间以并行块中的最长时间为准;故上例子中,fork块中的持续时间为15个时间单位;仿真模拟图如下:
我们可以给块语句结构命名。
块被命名后,可以通过层次名引用的方法对变量进行访问。
`timescale 1ns/1ns module test; initial begin: runoob //命名模块名字为runoob,分号不能少 integer i ; //此变量可以通过test.runoob.i 被其他模块使用 i = 0 ; forever begin #10 i = i + 10 ; end end reg stop_flag ; initial stop_flag = 1'b0 ; always begin : detect_stop if ( test.runoob.i == 100) begin //i累加10次,即100ns时停止仿真 $display("Now you can stop the simulation!!!"); stop_flag = 1'b1 ; end #10 ; end endmodule
仿真结果如下:
条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。
条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。
条件语句使用结构说明如下:
if (condition1) true_statement1 ;
else if (condition2) true_statement2 ;
else if (condition3) true_statement3 ;
else default_statement ;
case 语句是一种多路条件分支的形式,用来解决 if 语句中有多个条件选项时使用不方便的问题。
case(case_expr)
condition1 : true_statement1 ;
condition2 : true_statement2 ;
……
default : default_statement ;
endcase
case 语句执行时,如果 condition1 为真,则执行 true_statement1 ; 如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。如果各个 condition 都不为真,则执行 default_statement 语句。
default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。
条件选项可以有多个,不仅限于 condition1、condition2 等,而且这些条件选项不要求互斥。虽然这些条件选项是并发比较的,但执行效果是谁在前且条件为真谁被执行。
ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。
case 语句中的条件选项表单式可以是常量,也可以是 x 值或 z 值。
当多个条件选项下需要执行相同的语句时,多个条件选项可以用逗号分开,放在同一个语句块的候选项中。
case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值。
Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。
循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。
while (condition) begin
…
end
实例:
`timescale 1ns/1ns module test ; reg [3:0] counter ; initial begin counter = 'b0 ; while (counter<=10) begin #10 ; counter = counter + 1'b1 ; end end //stop the simulation always begin #10 ; if ($time >= 1000) $finish ; end endmodule
for(initial_assignment; condition ; step_assignment) begin
…
end
实例:
// for 循环语句
integer i ;
reg [3:0] counter2 ;
initial begin
counter2 = 'b0 ;
for (i=0; i<=10; i=i+1) begin
#10 ;
counter2 = counter2 + 1'b1 ;
end
end
repeat (loop_times) begin
…
end
// repeat 循环语句
reg [3:0] counter3 ;
initial begin
counter3 = 'b0 ;
repeat (11) begin //重复11次
#10 ;
counter3 = counter3 + 1'b1 ;
end
end
forever begin
…
end
产生一个时钟信号:
reg clk ;
initial begin
clk = 0 ;
forever begin
clk = ~clk ;
#5 ;
end
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。