商震 发表于 2021-9-17 15:40:05

task,repeat,defparam和条件编译示例,verilog高频高级语法1

1、task语法往往使用于较复杂的执行任务描述。实际使用时,只需要在相应使用的地方调用该函数即可代表把task内的语句又写了一遍。(黄四郎的帽子出现了,就代表黄四郎出现了)
repeat语法相当于指定次数的循环。
task语法的使用范例:这里以模拟生成多次按键消抖为使用背景

task key_gen;
begin
    key_out = 1'b1;
    repeat(50)begin
      myrand = {$random}%65536;//0~65535;
      #myrand key_out = ~key_out;         
    end
    key_out = 0;
    #25000000;
   
    repeat(50)begin
      myrand = {$random}%65536;//0~65535;
      #myrand key_out = ~key_out;         
    end
    key_out = 1;
    #25000000;   
end
endtask


当需要调用这个任务时:


initial begin
key_out = 1'b1;
    while(1)
    begin
      @(posedge key_press);
      key_gen;
    end
end


如上使用即可。

2、使用defparam函数,可以在上层模块中修改下层模块的指定参数。比如bin_counter工程中计数器计数1秒钟,需要仿真中时间过长,而在设计文件中修改计数器的计数值容易忘记改回来,从而人眼看不到周期1秒的闪烁而给自己板级验证时挖坑,此时,使用defparam函数在仿真文件中替换参数可以既加快仿真速度,又保持设计文件原封不动。指定被例化的模块内的参数,用法如下:

defparam bin_counter_inst.MCNT = 24_999_999;

bin_counter bin_counter_inst (
      .clk(clk),
      .reset_n(reset_n),
      .led(led)
);


在bin_counter_inst模块中,参数正常使用即可,无其他改动,其代码如下:

module bin_counter
(
      clk,
      reset_n,
      led
);
      input clk;
      input reset_n;
      output led;   
      reg led;
wire reset;
assign reset=~reset_n;
parameter MCNT = 24_999_999;


3、条件编译用法。条件编译可以用于设计V文件之中,也可以用于tb文件之中。它的功能是可以结合使用实际情况,选择性的编译部分代码,让程序更灵活。实际使用时,只需要将编译条件给注释掉,就能够系统性的整体变换编译策略。
例如,在AC609开发板选择数码管模块的类型时,可以使用条件编译,在一套程序之中,迅速实现模块是段选位选还是SPI传输的选择实现。


将`define注释掉后,会得到不同的编译策略,解释如下:

当然,选择性的编译并不是只针对一处代码。在相同的设计文件中,可以反复使用`ifdef——`else——endif描述。


页: [1]
查看完整版本: task,repeat,defparam和条件编译示例,verilog高频高级语法1