基于SparkRoad的《Verilog数字系统设计教程·第三版(夏宇闻)》学习(8)——第7章

学习:

  1. 提供了监控和输出参数列表中的表达式或变量值的功能——P 100
    其参数列表中输出控制格式字符串和输出表列的规则和\(display 中一样 \)monitor 与 $ display 的不同之处还在于 $monitor 往往在 initial 块中调用,并且要用 $ monitoroff 来结束工作,否则会一直进行
    使用格式 $monitor ( $time, ,"rxd=%b txd=%b", rxd, txd);——P 101 有实例
  2. Verilog HDL 中有两种类型的时间系统函数:$time 与 $ realtime。
    $time 可以返回一个 64 位的整数来表示当时仿真时刻值。该时刻是以模块的仿真时间尺度为基准
  3. $time 显示时刻受时间尺度影响,即例子中
    `timescale 10ns/1 ns
    这个即标识了:显示时刻的时间尺度是 10 ns,也可以理解为步长
    1 ns 代表的是精度,对于输出的影响很大,进度要求越高,在输出时耗时越长
    此写法是必须要整数才可以,所以即使自命名用时 #p 为小数,也需要自动取整之后才会继续运行
    更详细的可以见 P 111
  4. $realtime 则不需要取整,当 #p 为小数时,可以顺利输出——P 102
  5. $finish 作用是退出仿真器,返回主操作系统,但是要少用,因为会导致仿真波形直接消失
  6. $stop 建议使用,是将 EDA 工具置成暂停模式,在仿真环境下给出一个交互式的命令提示符
  7. 在 Verilog HDL 中有两个系统任务 $readmemb 和 $ readmemh,用来从文件中读取数据到存储器中
    这两个系统任务可以在仿真的任何时刻被执行,其使用格式公有六种——详见 P 103
  8. Verilog HDL 也提供了编译预处理的功能,允许使用几个特殊的命令,使得在处理时先对这些特殊的命令进行“预处理”,然后将这些预处理的结果和源程序一起进行通常的编译处理
    这些预处理命令通常以 ` 开始

思考题:

  1. 为什么在多模块调试的情况下 monitor 需要配合 monitor 需要配合 monitor 需要配合 monitoron 和$monitoroff 来工作?
    monitoron 和 monitoroff 任务的作用是通过打开和关闭监控标志来控制监控任务 monitor 的启动和停止。

  2. 请用$random 配合求模运算编写:
    (1)用于测试的跳变沿抖动为周期1/10的时钟波形。
    (2)随机出现的脉宽随机的窄脉冲。

    module random_pulse(dout); 
       output[9:0] dout; 
       reg[9:0] dout; 
       integer delay; 
       initial begin #10 dout=0; 
       for(k=0;k<100;k=k+1) begin delay={$random}%10; 
       #delay dout=1; 
       #delay dout=0; 
       end 
    end endmodule   //这个代码并不熟悉,还需要再看
    
  3. Verilog 的编译预处理与 C 语言的编译预处理有什么不同?
    Verilog 的编译处理,在编译处理命令之前要以 ` 开头。

  4. 请仔细阐释 timescale 编译预处理的作用?

    timescale 命令用来说明跟在该命令后的模块的时间单位和时间精度。使用 `timescale 命令可以在同一个设计里包含采用了不同的时间单位的模块。

  5. 不同 `timescale 定义的多模块仿真测试时需要注意什么?

    如果在同一个设计里,多个模块中用到的时间单位和时间精度单位不同,需要用到以下的时间结构:
    (1)用 timescale 命令来声明本模块中所用到的时间单位和时间精度;
    (2)用系统任务 printscale 来输出显示一个模块的时间单位和时间精度;
    (3)用系统函数 printtimescale 来输出显示一个模块的时间单位和时间精度;
    (4)用系统函数 time 和$realtime 及%t 格式声明来输出 EDA 工具记录的时间信息。

  6. 为什么说系统任务$readmem 可以用来产生用于算法验证的及其复杂的测试用数据流?

    在 Verilog HDL 程序中有两个系统任务 readmemb 和 readmemh , 并用来从文件中读取数据到存储器中,这两个系统任务可以在仿真的任何时刻被执行使用。复杂数据可以用 C 语言产生,存在文件中,用 readmemh,并用来从文件中读取数据到存储器中,这两个系统任务可以在仿真的任何时刻被执行使用。复杂数据可以用 C 语言产生,存在文件中,用 readmemh,并用来从文件中读取数据到存储器中,这两个系统任务可以在仿真的任何时刻被执行使用。复杂数据可以用 C 语言产生,存在文件中,用 readmem 取出存入存储器,再按节拍输出,这在验证算法逻辑电路时特别有用。

  7. 为什么熟练地使用条件编译命令可以使源代码有更大的灵活性,可以使用于不同的实现对象,如不同工艺的 ASIC 或速度规模不同的 FBGA 或 CPLD,从而为软核的商品化创造条件?

    合理地使用条件编译和条件执行预处理可以使测试程序适应不同的编译环境,也可以把不同的测试过程编写到一个统一的测试程序中去,可以简化测试的过程,对于复杂设计的验证模块的编写很有实用价值。

posted @ 2023-05-30 14:43  江左子固  阅读(43)  评论(0编辑  收藏  举报