开坑:Verilog HDL学习 【5】

萌新小白,为做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可以变为动态存储,从而避免了共用存储区而导致的数据错乱。

实用建模技术

  • 过程连续赋值

连续赋值可以实时的将变化给到模块,过程赋值运行到这里才会触发语句,过程连续赋值语句可以在一定时间内将变化传递。

  1. assign和deassign 在块中用assign将让数据直接传递实时变化直到用了deassign(现已不常用)

  2. force和release 可以强制将某条线网的赋值改变,知道release语句

  • 改写覆盖

  1. defparam 在运行某模块时临时改变某个参数(parameter)的值

  • 条件编译与条件执行

  1. 条件编译:

    `ifdef,`,`else,`elsif,`endif
  2. 条件执行

    $test$plusargs("display_var") //设置display_var时显示变量
    $VALUE$plusargs("testname=%s",test_string)//该系统任务用于测试参数值
  • 时间尺度

`timescale 100ns/1ns//参考时间单位100ns,精度1ns
  • 常用系统任务

  1. 文件输出:

    打开文件:$fopen;写文件:$fdisplay,$fmonitor,$fwrite,$fstrobe;关闭文件:$fclose
  2. 显示层次

    $display,$write,$monitor,$strobe
  3. 选通显示

    $strobe
  4. 随机数生成

    $random(<seed>);
  5. 用数据文件对存储器初始化

    $readmemb("<filename>",<memory_name>,<start_addr>,<finish_addr>);
  6. 值变存储

    $dumpfile,$dunmvars,$dumpon,$dumpoff,$dumpall

书目参考:Verilog HDL数字设计与综合(第二版)[美] Samir Palnitkar