verilog学习
书目:verilog HDL 数字设计与综合第二版夏宇闻
第八章
一、函数(function)
1、函数能够调用另一个函数,但不能调用另一个任务
2、函数总是在仿真时刻0就开始执行
3、函数一定不能包含任何延迟、事件或者时序控制生命语句
4、函数至少有一个输入变量,可以有多个输入变量
5、函数只能有一个返回值,函数不能有输出(output)或者双向(inout)变量
6、verilog中的函数是不能进行递归调用,某函数在两个不同的地方被同时调用,计算结果不确定
7、在函数声明时使用关键字automatic,该函数则成为自动的或递归的,可以被并发调用
8、常量函数
function integer clogb2(input integer depth)
begin
for(clogb2=0;depth>0;clogb2=clogb2+1)
depth=deth>>1
end
endfunction
二、任务(task)
1、任务能调用另一个任务,也能调用另一个函数
2、任务可以在费仿真时刻零执行
3、任务可以包含延迟、事件或者时序控制声明
4、任务可以没有或者有多个输入、输出和双向变量
5、任务不返回任何值,任务可以通过输出和双向变量传递多个值
6、当任务在模块的两个地方被同时调用,可能会出现错误,此时要在task的关键词前加automatic关键词,实现自动可重入任务
第九章
一、过程连续赋值
1、过程连续赋值语句:允许在有限的时间内将表达式的值连续地加到寄存器或线网。
2、关键字assign和deassign表示第一类过程连续赋值语句。左值只能为寄存器或拼接的寄存器组
3、assign用来覆盖原值,deassign取消覆盖
4、force和release表示过程连续赋值语句的第二种形式,既可以用来改写寄存器上的赋值也可以改写线网上的赋值
5、force和release应当只出现在激励中
二、改写(覆盖)参数
1、参数可以在模块内定义,编译时,参数根据每个模块调用单独改变。
2、可以通过defparam语句或者模块调用参数赋值
3、defparam:
module hello_world;
parameter id_num=0;
initial
$display(“Displaying hello_world id num”=%d,id_num);
endmodule
module top
deparam w1.id_num=1,w2.id_num=2;
hello_world w1(1);
hello_world w2(2);
endmodule;
4、模块调用参数:
module top;
hello_world #(1) w1;
hello_world #(.id_num(2)) w2;
三、条件编译和执行
1、条件编译可以用编译指令ifdef
ifndef else
elsif `endif来实现
2、条件执行语句语允许设计者在运行时控制语句执行的流程,所有语句被编译,但是有条件的执行
3、条件执行标志只可用于行为语句:plusargs
四、时间尺度
1、仿真的时间单位:`timescale 100ns/1ns (参考时间单位为100ns,精度为1ns)
五、常用的系统任务
1、文件输出:打开文件$fopen $fopen("<name_of_file>")
<file_handle>=$fopen(<name_of_file>)
2、写文件:fmonitor,fstrobe,p1,p2等为变量信号名或带引号字符串,verilog会把输出写入
与文件描述符中值为1的位相关联的所有文件$fdisplay(<file_descripr or>,p1,p2,……,pn);
$monitor(<file_descripr or>,p1,p2,……,pn);
3、关闭文件$fclose(<file_descriptor>)
4、strobe 选通显示、可以在同时执行的其他赋值语句执行完在执行,保证显示正确的结果;
6、随机数生成:$random():seed可以是reg,integer,time 返回一个32位整数
7、正负随机数的生成:
reg [23:0] rand1,rand2;
rand1=$random%60
rand2={$random}%60 生成0到59的正数
六、值变转储文件(VCD)
选择要转储的模块实例或者模块实例信号(dumpfile)
选择转储的起点和终点(dumpall)