1.在修改为 tb1.sv 之后,编译仿真,查看仿真行为是否同 tb1.v 的仿真行为一致?这说明了什么呢?
tb1.v与tb1.sv仿真行为一致。说明sv是兼容v的。
2.将 tb1.sv 中的信号变量类型由 reg 或者 wire 修改为 logic 类型,再编译仿真, 查看行为是否同修改之前的一致呢?这是为什么?
一致,由于不存在多驱动,logic 作为一个变量类型,数据类型为四值逻辑,可以用logic代替reg和wire,如果存在多驱动,不能用logic。
3.在步骤 2 的基础上,如果将 rstn 的类型由 logic 修改为 bit 类型,再编译仿真,行 为是否同步骤 2 的一致呢?这是为什么
不一致,因为logic为四值逻辑,默认为x,而bit为二值逻辑,默认为0。
TB2. 方法 task 和函数 function
1.不做修改的情况下,对 tb2.sv 进行编译仿真,时钟信号和复位信号还正常吗?为什么
不正常,因为没有调用task,故时钟和复位没有驱动,所以呈现为x。
2.在标记的两个 initial 块中分别调用产生时钟和复位的 task,再编译仿真查看 时钟信号和复位信号,是否恢复正常呢?task 在两个 initial 块中调用?这是为什么呢?是否可以在一个 initial 块中 调用呢?如果可以,调用它们的顺序是什么?
正常,此时调用了task,然后clk与rstn被驱动。但是注意,不要写在一个initial中,因为多个initial是并行的,互不干扰,同一个initial中,回顺序执行,如果clk_gen()没有结束,则会一致执行。
3.如何测量目前时钟的周期和频率呢?如果我们想进化 clk_ gen()方法,使其变为可以设置时钟周期的任务 clkgen(intperoid),那么该怎么修改目前的任务 clk_gen()呢?修改成功后,请在 initial 块中调用任务 cdk_ gen(20),看看波形中的时钟周期 是否变为 20ns 呢?
首先,找到想要测量位置的起点,然后点击左下角的绿色加号。然后找到终点,再点击加号就可以测量周期。点击,绿色加号边上的位置.然后点击下面箭头处就可以实现测试频率。
4.如果将 timescale 1ns/1ps 修改为 timescale 1ps/1ps,那么仿真中的时钟周期是否发生变化?这是为什么呢
周期改变从20ns,变为20ps,但是精度没有改变。`timescale 1ns / 1ps(1ns是单位,1ps是精度)