萌新小白,为做FPGA大创,开始学习Verilog HDL
函数只能够返回一个值,且在仿真的0时刻就开始运行,可以调用别的函数但是不能调用任务
任务可以理解为一系列事件,可以在非0时刻运行,可以调用函数、任务,不返回值但可以通过output、inout、传递结果
任务需要声明,声明后可以直接书写调用,用task和endtask
module sequence; reg clock; …… initial init_sequence; always begin asymmetric_sequence; end …… task init_sequence; begin clock=1'b0;//'(消除绿色) end endtask task asymmetric_sequence; begin #12 clock=1'b0; #5 clock=1'b1; #3 clock=1'b0; #10 clock=1'b1; end endtask …… endmodule
函数返还返还单个值,故需要声明是一个怎样的值
module top; function automatic integer factorial; input [31:0] oper; integer i; begin if(oper>=2) factorial=factorical(oper-1)*oper; else factorial=1; end endfunction
因为函数和事件本身是静态存储,所以调用起来可能会有很大的冲突,用automatic可以变为动态存储,从而避免了共用存储区而导致的数据错乱。
过程连续赋值
连续赋值可以实时的将变化给到模块,过程赋值运行到这里才会触发语句,过程连续赋值语句可以在一定时间内将变化传递。
assign和deassign 在块中用assign将让数据直接传递实时变化直到用了deassign(现已不常用)
force和release 可以强制将某条线网的赋值改变,知道release语句
改写覆盖
defparam 在运行某模块时临时改变某个参数(parameter)的值
条件编译与条件执行
条件编译:
`ifdef,`,`else,`elsif,`endif条件执行
$test$plusargs("display_var") //设置display_var时显示变量 $VALUE$plusargs("testname=%s",test_string)//该系统任务用于测试参数值
时间尺度
`timescale 100ns/1ns//参考时间单位100ns,精度1ns
常用系统任务
文件输出:
打开文件:$fopen;写文件:$fdisplay,$fmonitor,$fwrite,$fstrobe;关闭文件:$fclose显示层次
$display,$write,$monitor,$strobe选通显示
$strobe随机数生成
$random(<seed>);用数据文件对存储器初始化
$readmemb("<filename>",<memory_name>,<start_addr>,<finish_addr>);值变存储
$dumpfile,$dunmvars,$dumpon,$dumpoff,$dumpall
书目参考:Verilog HDL数字设计与综合(第二版)[美] Samir Palnitkar