[例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
2)电平敏感时序控制
verilog同时也允许使用另外一种形式表示电平敏感时序控制(即后面的语句和语句块需要等待某个条件为真才能执行)。
always
Wait(count_enable) #20 count=count+1;
以上例子仿真器连续监视count_enable的值。如果为0,则不执行后面的语句,如果为1,则20个时间单位之后执行这条语句。
2.task和function说明语句
task和function说明语句的不同点:
(1)函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
(2)函数不能启动任务,而任务能启动其他任务和函数。
(3)函数至少要有一个输入变量,而任务可以没有或多个任何类型的变量。
(4)函数返回一个值,而任务则不返回值。
函数的目的是通过返回一个值来相应输入信号的值。任务却能支持多种目地,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出。
verilog模块使用函数时是把它当作表达式中的操作符,这个操作的结果值就是这个函数的返回值。
task说明语句
1)任务的定义
Task<任务名>;
<端口及数据类型的声明语句>
<语句1>
<语句2>
…………..
<语句n>
endtask
2)任务的调用及变量的传递
调用:<任务名>(端口1,端口2,端口3,……..,端口n);
任务定义:
task my_task;
input a, b;
inout c;
output d, e;
…
<语句> //执行任务工作相应的语句
…
c = foo1; //赋初始值
d = foo2; //对任务的输出变量赋值
e = foo3;
endtask
[例18]:module disp;
reg[31:0] rval;
pulldown(pd);
initial
begin
rval=101;
$display("rval=%h hex %d decimal", rval, rval);
$display("rval=%o otal %b binary", rval, rval);
$display("rval has %c ascii character value",rval);
$display("pd strength value is %v",pd);
$display("current scope is %m");
$display("%s is ascii value for 101",101);
$display("simulation time is %t",$time);
end
endmodule
其输出结果为:
rval=00000065 hex 101 decimal
rval=00000000145 octal 00000000000000000000000001100101 binary
rval has e ascii character value
pd strength value is StX
current scope is disp
e is ascii value for 101
simulation time is 0
文件输出
verilog 的结果通常输出到标准输出和文件veilog.log中。可以将verilog的输出重新定向到选择文件。
1)打开文件 $fopen
用法:$fopen(“<文件名>”);
用法:<文件句柄>=$fopen(“<文件名>”);
[例20] 文件描述符
//多通道描述符
integer handle1, handle2, handle3; //整型数为 32 位
//标准输出是打开的; descriptor = 32'h0000_0001 ( 第0位置1)
initial
begin
handle1 = $fopen("file1.out"); //handle1 = 32'h0000_0002 (bit 1 set 1)
handle2 = $fopen("file2.out"); //handle2 = 32'h0000_0004 (bit 2 set 1)
handle3 = $fopen("file3.out"); //handle3 = 32'h0000_0008 (bit 3 set 1)
end
多通道描述符的优点在于可以有选择地同时写多个文件。下面将详细解释这一点。
//显示层次信息
module M;
initial
$display("Displaying in %m");
endmodule
//调用模块M
module top;
M m1 ( );
M m2 ( );
M m3 ( );
endmodule
仿真输出如下所示:
Displaying in top.m1
Displaying in top.m2
Displaying in top.m3
这一特征可以显示全层次路径名,包括模块实例、任务、函数和命名块。
选通显示
选通显示由关键字为$strobe的系统任务完成。
如果使用$strobe,该语句总是在同时刻的其他赋值语句执行完之后才执行。因此,$strobe提供了一种同步机制,它可以确保所有在同一时钟沿赋值的其他语句在执行完毕后才显示数据。
[例22] 选通显示
//选通显示
always @ (posedge clock)
begin
a = b ;
c = d ;
end