MCDF实验1

本文介绍了从Verilog过渡到SystemVerilog的过程,包括使用logic类型替代reg/wire,理解bit与logic类型的差异,以及task和function的使用。在时钟生成中,讨论了timescale的影响。此外,详细阐述了动态数组的创建和使用,以及在验证结构中如何实例化和操作多个通道。最后,提到了chnl_initiator模块中实现数据发送的方法chnl_idle()、chnl_write()和set_name()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

菜鸟记录

TB1.从Verilog到SV的进场

1.1 修改tb1.sv,比较和tb.v之间的仿真行为差别:如下图所示并无差别,可见sv对Verilog是全兼容的。

1.2 将tb1.sv中的reg或者wire类型修改为logic类型,编译仿真行为无差别,说明,在SV中,reg和wire类型都可以简化为logic类型。

1.3  在1.2的基础上,将rstn的类型由logic变为bit,查看编译仿真行为,可见,一开始时钟信号便被拉低为0,这是以为bit二值逻辑默认为0,而logic四值逻辑默认为x,经过10ns后才被拉低为0。

TB2. 方法task和函数function

 2.1 不做修改的情况下, 对 tb2.sv 进行编译仿真, 时钟信号和复位信号还正常吗?为什么?

      不正常。

2.2 在两个 initial 块中分别调用产生时钟和复位的 task, 再编译仿真查看时钟信号和复位信号, 是否恢复正常呢?

        恢复正常。

2.3 为什么要将两个 task 在两个 initial 块中调用?这是为什么呢?是否可以在一个 initial 块中
调用呢?如果可以, 调用它们的顺序是什么?

        因为task和function一样,是一种函数,需要被调用才能被执行,必须被过程块initial或者always调用才能被执行。

        不可以放在一个initial块中调用,多个initial块是并行执行的,而initial块中的语句是串行执行的。

2.4 是否可以读出目前时钟的周期和频率呢?该如何测量呢?如果我们想进化 clk_gen()方法, 使其变为可以设置时钟周期的任务 ckgen(int peroid), 那么该怎么修改目前的任务clk_gen()呢?修改成功后, 请在 initial 块中调用任务 cdk_ gen(20), 看看波形中的时钟周期是否变为 20ns 呢?

        通过wave菜单栏,可以添加查看时钟频率,周期则可以通过两个bar之间数据读出。

task clk_gen(int period);
  clk <= 0;
  forever begin
    #(period/2) clk<= !clk;
  end
endtask

2.5 如果将 timescale 1ns/1ps 修改为 timescale 1ps/1ps, 那么仿真中的时钟周期是否发生变
化?这是为什么呢?

        周期发生变化,变为20ps,因为timescale 1ps/1ps,第一个参数为仿真所用时间单位,第二个参数为时间精度。

TB3. 数组的使用

要先生成 100 个数,并对它们按照日前的数值规则进行赋值,创建 3 个动态数组,分别放置要发送给 3 个 slave 的数据。利用之前生成的数组数据, 将它们读取并发送给三个 channel。
 

// generate 100 data for each dynamic array
initial begin
  chnl0_arr = new[100];
  chnl1_arr = new[100];
  chnl2_arr = new[100];
  foreach(chnl0_arr[i]) begin
    chnl0_arr[i] = 'h00C0_00000 + i; 
    chnl1_arr[i] = 'h00C1_00000 + i; 
    chnl2_arr[i] = 'h00C2_00000 + i; 
  end
end

// use the dynamic array, user would send all of data
// data test
initial begin 
  @(posedge rstn);
  repeat(5) @(posedge clk);
  // channel 0 test
  // TODO use chnl0_arr to send all data
  foreach(chnl0_arr[i]) chnl_write(0,chnl0_arr[i]);
  // channel 1 test
  // TODO use chnl1_arr to send all data
  foreach(chnl1_arr[i]) chnl_write(1,chnl1_arr[i]);
  // channel 2 test
  // TODO use chnl2_arr to send all data
  foreach(chnl2_arr[i]) chnl_write(2,chnl2_arr[i]);
end

TB4. 验证结构

例化三个chnl_initiator 实例 chnl0_init、chnl1_ init 和 chnl2_init。它们的作用扮演每个channel_slave 通道对应的 stimulator,发送激励,因此需要在其模块chnl_initiator 中定义它的三个方法,即 set_ name()、chpl_write()和 chnl_idle()。
① chnl_idle() :要实现的一个时钟周期的空闲, 在该周期中, ch. valid 应为低,ch. data 应
为 0。

② chnl_ write():要实现一次有效的写数据,并随后调用 chnl_idle( ),实现一个空闲周期,在实现有效写数据时,需要考虑如何使用 ch_ ready 信号,结合功能描述的 channel_slave接口时序看,只有当 valid 为高且 ready 为高时,数据写入才算成功,如果此时 ready 为低,那么则应该保持数据和 valid 信号,直到 ready 拉高时,数据写入才算成功。
③ set_name( ):设置实例的名称,在 initial 过程块“data_test"中,在发送各个 channel 数据前,设置各个 channel_initiator 的实例名称,这样方便在仿真时各个实例的打印信总可以显示它们各自的名称、 数据发送时间和数据内容, 便于阅读和调试。

module chnl_initiator(
  input               clk,
  input               rstn,
  output logic [31:0] ch_data,
  output logic        ch_valid,
  input               ch_ready,
  input        [ 5:0] ch_margin
);

string name;

function void set_name(string s);
  name = s;
endfunction

task chnl_write(input logic[31:0] data);
  // USER TODO
  // drive valid data
  @(posedge clk);
  ch_valid <= 1;
  ch_data <= data;
  @(negedge clk);
  wait(ch_ready === 'b1);
  $display("%t channel initial [%s] sent data %x", $time, name, data);
  chnl_idle();
endtask

task chnl_idle();
  // USER TODO
  // drive idle data
  @(posedge clk);
  ch_valid <= 0;
  ch_data <= 0;
endtask

endmodule

<think>好的,用户正在寻找与MCDF实验相关的Lab0笔记和课程资料。首先,我需要回顾已有的引用内容,看看是否有相关信息。引用[2]提到了“路科验证MCDF_uvmlab0”,这可能与Lab0相关。其中描述了在UVM测试环境中注释掉raise/drop_objection,并添加了10ns延时和uvm_info的信息。这可能是Lab0中的实验步骤,涉及UVM的基本结构和仿真设置。 用户提到的MCDF实验可能是一系列验证实验,Lab0通常是入门级的实验,介绍基本环境和流程。根据引用[3],MCDF实验涉及寄存器地址和操作,但Lab0可能更侧重于环境搭建和基础验证组件。引用[2]中的代码示例展示了run_phase的任务结构,适合Lab0的内容,可能涉及如何编写测试用例和仿真控制。 此外,用户可能需要知道如何获取完整的课程资料或实验指导。可能需要建议用户参考路科验证的官方资料、课程网站或联系相关教育机构。同时,引用提供的博客链接可能包含更多细节,但需注意版权问题,建议用户通过正规渠道获取材料。 需要确认是否存在其他引用中未提到的Lab0内容,但根据现有信息,引用[2]是最相关的。总结来说,回答应指出引用[2]中的内容与Lab0相关,并建议用户查阅该资料,同时提供可能的获取途径。</think>根据您提供的信息,MCDF实验Lab0的相关内容在引用[2]中有部分涉及,主要与UVM验证框架的基础配置和测试用例设计相关。以下是关键信息整理: ### MCDF实验Lab0相关内容 1. **UVM测试环境配置** Lab0实验展示了基础UVM测试结构,移除了`raise/drop_objection`流程(旧版UVM控制方式),改用`#10ns`延时结合`uvm_info`输出调试信息。这符合UVM1.2版本后对`objection`机制的弱化要求[^2]。 ```systemverilog task run_phase(uvm_phase phase); `uvm_info("UVM_TOP", "test is running", UVM_LOW) #10ns; `uvm_info("UVM_TOP", "test finished after 10ns", UVM_LOW); endtask ``` 2. **仿真时间单位控制** 代码中未显式定义时间单位(如`timescale 1ns/1ps`),默认采用仿真器的最小时间分辨率(通常为1ns)。因此,低于1ns的延时(如`#5ns`)会被忽略。 3. **实验目标推测** 根据代码片段,Lab0可能聚焦于: - UVM测试平台基础结构搭建 - 调试信息输出与仿真控制 - UVM验证组件的初步调用 ### 资料获取建议 1. **课程官方渠道** 建议联系路科验证官方或访问其教学平台获取完整实验指导书。部分公开资料可通过其官网或合作教育平台查询。 2. **参考博客资源** 引用[2]中提到的博客文章(标题含“路科验证MCDF_uvmlab0”)可能包含更详细的实验步骤解析,但需注意第三方资料的准确性验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值