:[例]
例6.6 or事件控制(敏感列表)。
//有异步复位的电平敏感锁存器
always @ (reset or clock or d)
begin
if (reset)
q = 1'b0 ;
else if(clock)
q = d ;
end
例6.7 逗号事件控制(敏感列表)
//有异步复位的电平敏感锁存器
always @ (reset , clock , d)
begin
if (reset)
q = 1'b0 ;
else if(clock)
q = d ;
end
上面两个能看出,or和逗号一个意思,可替换。
例6.8 @*操作符的使用
//用or操作符的组合逻辑块
//编写敏感列表很繁琐,并且很容易漏掉几个
always @(a or b or c or d or e or f or g or h or p or m)
begin
out1 = a? (b + c) : (d + e) ;
out2 = f? (g + h) : (p + m) ;
end
//用@*来代替所有输入变量
always @(*)
begin
out1 = a? (b + c) : (d + e) ;
out2 = f? (g + h) : (p + m) ;
end
例6.9 描述红绿黄交通灯行为的Verilog模块,学习其中使用的任务。
module traffic_lights;
reg clock , red , amber , green ;
parameter on = 1 , off = 0 , red_tics = 350 , amber_tics = 30 , green_tics = 200 ;
//交通灯初始化
initial red = off ;
initial amber = off ;
initial green = off ;
//交通灯控制时序
always
begin
red = on ;
light (red , red_tics) ;
green = on ;
light (green , green_tics) ;
amber = on ;
light (amber , amber_tics) ;
end
//定义交通灯开启时间的任务
task light;
output color ;
input [31:0] tics ;
begin
repeat(tics)
@(posedge clock) ;
//等待tics个时钟的上升沿
color = off;
end
endtask
//产生时钟脉冲的always块
always
begin
#100 clock = 0 ;
#100 clock = 1 ;
end
endmodule
例6.10 阶乘函数的定义和调用。
module tryfact ;
//函数的定义-------------
function [31:0] factorial;
input [3:0] operand ;
reg [3:0] index ;
begin
factorial = 1;
for (index = 2; index <= operand; index = index + 1)
factorial = index * factorial ;
end
endfunction
//函数的测试---------------
reg [31:0] result ;
reg [3:0] n ;
initial
begin
result = 1;
for(n = 2; n <= 9; n = n + 1)
begin
$display ("[s:9]artial result n = %d result = %d",n,result);
result = n * factorial(n)/((n * 2) + 1) ;
end
$display("Finalresult = %d",result);
end
endmodule
利用上述实例,学习函数的使用方式。
例6.19
module printval;
reg [11:0] rl ;
initial
begin
rl = 10 ;
$display ("[s:9]rinting with maximum size = %d = %h",rl,rl) ;
$display ("[s:9]rinting with minimum size = %0d = %0h",rl,rl) ;
end
endmodule
输出结果为:
Printing with maximum size = 10 = 00a
Printing with maximum size = 10 = a
上述例子熟悉任务$display的用法。
例6.20 文件描述符
//多通道文件描述符
integer handle1,handle2,handle3 ;
//整型数为32位
initial
begin
handle1 = $fopen("file1.out") ; //handle1 = 32’h0000_0002
handle2 = $fopen("file2.out") ; //handle2 = 32’h0000_0004
handle3 = $fopen("file3.out") ; //handle3 = 32’h0000_0008
end
//写文件
//把输出写到文件描述符值为1的所有文件中。
integer desc1,desc2,desc3 ;
initial
begin
desc1 = handle1 | 1 ; //desc1 = 32'h0000_0003
$fdisplay (desc1,"Display 1") ; //写文件到file1.out
desc2 = handle2 | handle1 ; //desc2 = 32'h0000_0006
$fdisplay (desc2,"Display 2") ; //写文件到file2.out
desc3 = handle3 ; //desc3 = 32'h0000_0008
$fdisplay (desc3,"Display 3") ; //写文件到file3.out
end
//关闭文件
$fclose(handle1) ;
$fclose(handle2) ;
$fclose(handle3) ;
用以上例子熟悉文件的输出。
例6.23
值变转储文件。
initial
$dumpfile ("XXXXXXXXXp");
//仿真信息转储到XXXXXXXXXp文件
initial
$dumpvars;
//没有指定变量范围,把设计中全部信号都转储
initial
$dumpvars(1,top);
//转储模块实例top中的信号
//数1表示层次的等级,只转储top下第一层信号。
//即转储top模块中的变量,而不转储在top中调用
//模块中的变量
initial
$dumpvars (2,XXXXXX);
//转储XXXXXX模块下两层的信号
initial
$dumpvars (0,XXXXXX);
//数0表示转储XXXXXX模块快下面各个层的所有信号
//启动和停止转储过程
initial
begin
$dumpon;
//启动转储过程
#100000 $dumpoff;
//过了100000个仿真时间单位后,停止转储过程
end
//生成一个检查点,转储所有VCD变量的先行值
initial
$dumpall;
通过上面例子熟悉值变转储文件任务,$dumpfile , $dumpvars , $dumpon , $dumpoff , $dumpall