芯路恒电子技术论坛

 找回密码
 立即注册

扫一扫,访问微社区

热搜: 活动
查看: 269|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2020-10-24 18:04
  • 45

    主题

    53

    帖子

    277

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    277
    发表于 2021-9-17 15:40:05 | 显示全部楼层 |阅读模式
    1、task语法往往使用于较复杂的执行任务描述。实际使用时,只需要在相应使用的地方调用该函数即可代表把task内的语句又写了一遍。(黄四郎的帽子出现了,就代表黄四郎出现了)
    repeat语法相当于指定次数的循环。
    task语法的使用范例:这里以模拟生成多次按键消抖为使用背景

    1. task key_gen;
    2. begin
    3.     key_out = 1'b1;
    4.     repeat(50)begin
    5.       myrand = {$random}%65536;//0~65535;
    6.       #myrand key_out = ~key_out;         
    7.     end
    8.     key_out = 0;
    9.     #25000000;
    10.    
    11.     repeat(50)begin
    12.       myrand = {$random}%65536;//0~65535;
    13.       #myrand key_out = ~key_out;         
    14.     end
    15.     key_out = 1;
    16.     #25000000;   
    17. end
    18. endtask
    复制代码


    当需要调用这个任务时:


    1. initial begin
    2. key_out = 1'b1;
    3.     while(1)
    4.     begin
    5.       @(posedge key_press);
    6.       key_gen;
    7.     end
    8. end
    复制代码


    如上使用即可。

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

    1. defparam bin_counter_inst.MCNT = 24_999_999;

    2. bin_counter bin_counter_inst (
    3.         .clk(clk),
    4.         .reset_n(reset_n),
    5.         .led(led)
    6. );
    复制代码


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

    1. module bin_counter
    2. (
    3.         clk,
    4.         reset_n,
    5.         led
    6. );
    7.         input clk;
    8.         input reset_n;
    9.         output led;   
    10.         reg led;
    11.   wire reset;
    12.   assign reset=~reset_n;
    13.   parameter MCNT = 24_999_999;
    复制代码


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

    019.jpg
    将`define注释掉后,会得到不同的编译策略,解释如下:
    020.jpg
    当然,选择性的编译并不是只针对一处代码。在相同的设计文件中,可以反复使用`ifdef——`else——endif描述。
    021.jpg

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|手机版|Archiver|芯路恒电子技术论坛  |鄂ICP备2021003648号

    GMT+8, 2021-10-19 10:47 , Processed in 0.062109 second(s), 13 queries , File On.

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表