路科验证V0实验lab2总结


一. bit 和 logic

二. 数组的方法

2.1 数组的分类:定宽数组,动态数组,队列,关联数组

2.2 数组的方法:缩减,定位,排序

三. 对代码中的问题解释

一. bit 和 logic
在这里插入图片描述
​​
关于地址使用 bit 数据使用 logic , 我的总结如下:

  1. logic 类型只能有一个驱动,可以被连续赋值

  2. logic 是 四状态类型(0, 1, X, Z)

  3. bit 是 二状态类型 (0,1)

  4. 它们都是无符号的

故,bit 更适合地址,logic 更适合数据,(后续还有发现,俺再来改)

二. 数组的方法
2.1 数组的分类:定宽数组,动态数组,队列,关联数组

本实验使用的是队列,并对队列进行了foreach 和 for 循环遍历,还使用了一些数组的方法如下:
https://img-blog.csdnimg.cn/da8b942063584e718c80ea1580dbfaca.png#pic_center
在这里插入图片描述

其中,foreach中的索引index不用声明。
学习就要总结,故对数组的方法(适用于非合并数组) 总结如下:

2.2 数组的方法:缩减,定位,排序
数组的缩减: 假定数组名为 arrayname
求和: arrayname.sum()

求积:arrayname.product()

:arrayname.and()

:arrayname.or()

异或: arrayname.xor()

求数组的宽度:都可以使用系统函数 $size(arrayname), 对于队列和动态数组还可以使用 arrayname.size()

从数组中,随机选择一个元素的方法,systemverilog没有提供专门的方法,可以使用$urandom_range($size(arrayname) - 1), 队列和动态数组还可以使用 $urandom_range(arrayname.size() - 1) (关于$urandom_range可以看绿皮书6.10节)

数组的定位:返回的是队列,不是标量 ( 定义 int d[] = '{9,1,8,3,4,4}😉
找最小值: d.min() // {1}

找最大值: d.max() // {9}

找数组中具有唯一值的队列:d.unique() // {9,1,8,3}

有关find的:

d.find with ( item > 3) // {9,8,4,4} 返回满足条件的元素的队列

d.find_index with (item > 3) // {0,2,4,5} 返回满足条件的元素索引的队列

d.find_first with (item > 99) // {} 返回满足条件的第一个元素

d.find_first_index with (item == 8) // {2} 返回满足条件的第一个元素的索引

d.find_last with (item == 4) // {4} 返回满足条件的最后一个元素

d.find_last_index with (item == 4) // {5} 返回满足条件的最后一个元素的索引

有关sum的

d.sum with ( item > 7) // 2 有两个元素满足条件 故返回2

d.sum with ((item > 7) * item) // 17 满足条件的元素的和

d.sum with (item <8 ) // 4

d.sum with (item < 8 ? item : 0 ) // 12

d.sum with (item == 4 ) // 2

总结是: d.sum 求的是后面的条件表达式为真的次数,返回值是index(索引)的数组定位方法,返回的值是 int , 不是 integer

数组的排序: int d[] = '{9,1,8,3,4,4};
d.reverse() // '{4,4,3,8,1,9} 翻转数组

d.sort() // '{1,3,4,4,8,9} 从小到大排序

d.rsort() // '{9,8,4,4,3,1} 从大到小排序

d.shuffle() // '{9,4,3,8,1,4} 随机排序

三. 对代码中的问题解释

`timescale 1ns/100ps
program automatic test(router_io.TB rtr_io);
    bit[3:0] sa;            //source address  (input port)
    bit[3:0] da;            // destination address  (output port)
    logic [7:0] payload[$]; // packet data array
    int run_for_n_packets;

    initial begin
        reset();
        run_for_n_packets = 21;
        repeat(run_for_n_packets) begin
            gen();
            send();
        end
        repeat(10) @(rtr_io.cb);  // 问题1: send() 后为什么要再触发10个clocking,10个够不够?
    end

task reset();
    rtr_io.reset_n = 1'b0;
    rtr_io.cb.frame_n <= '1;
    rtr_io.cb.valid_n <= '1;
    #2 rtr_io.cb.reset_n <= 1'b1;
    repeat(15) @(rtr_io.cb);
endtask: reset
//实验2的重点1在这个激励生成器
task gen();
    sa = 3;
    da = 7;
    payload.delete(); 
    repeat($urandom_range(2,4))   //$urandom_range(2,4) 产生值在2-4范围内的 
        payload.push_back($urandom);   // $urandom  平均分布, 返回32位无符号随机数  // 问题2: 送数据送了多少次,每次送多少
endtask: gen
//实验2的重点2在这三个任务的撰写
task send();
    send_addrs();
    send_pad();
    send_payload();
endtask: send

task send_addrs();
    rtr_io.cb.frame_n[sa] <= 1'b0;  // 问题3: 怎么知道frame_n在时钟上升沿拉低的?  
    rtr_io.cb.valid_n[sa] <= 1'b1;
    for(int i = 0; i < 4; i++) begin
        rtr_io.cb.din[sa] <= da[i];    //送 4位地址到 3号端口, 从低到高
        @(rtr_io.cb);   // 问题4: 这个时钟触发等于什么?
    end
endtask: send_addrs

task send_pad();
    rtr_io.cb.frame_n[sa] <= 1'b0;
    rtr_io.cb.valid_n[sa] <= 1'b1;
    rtr_io.cb.din[sa] <= 1'b1;
    repeat(5) @(rtr_io.cb);
endtask: send_pad

task send_payload();
    foreach(payload[index]) begin
      for(int i = 0; i < 8; i++) begin
            rtr_io.cb.din[sa] <= payload[index][i];
            rtr_io.cb.valid_n[sa] <= 1'b0;
            rtr_io.cb.frame_n[sa] <= ((i == 7) && (index == payload.size() - 1 ))   // frame_n 比 valid_n 早一个时钟沿拉高 
            @(rtr_io.cb)
      end
    end
    rtr_io.cb.valid_n[sa] <= 1'b1;
          
endtask: send_payload

endprogram: test

问题1: send() 后为什么要再触发10个clocking,10个够不够?

我理解是在发数据前正好有10个时钟,所以在最后再触发10个时钟,是为了等待下次的数据发送,10个应该是至少的

问题2: 送数据送了多少次,每次送多少?

送了2-4之间的随机次,每次送8位,因为payload定义为了 8位

问题3: 怎么知道frame_n在时钟上升沿拉低的?

这个和问题4有关联,因为是非阻塞赋值( <= ),故只有在rtr_io.cb触发的时候才赋值,

问题4: 这个时钟触发等于什么?

@(rtr_io.cb) 等于 @(posedge clock)

因为在interface中定义了 cb ,cb模块是有上升沿的时钟,所以问题3也就是在时钟上升沿拉低的

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 枚举类型 23 字符串 25 1.2 过程块和方法 27 initial和always 30 function逻辑电路 33 task时序电路 35 动态 静态变量 39 1.3 设计例化和连接 45 第二章 验证的方法 393 动态仿真 395 静态检查 397 虚拟模型 403 硬件加速 405 效能验证 408 性能验证 410 第三章 SV组件实现 99 3.1 接口 100 什么是interface 101 接口的优势 108 3.2 采样和数据驱动 112 竞争问题 113 接口中的时序块clocking 123 利于clocking的驱动 133 3.3 测试的开始和结束 136 仿真开始 139 program隐式结束 143 program显式结束 145 软件域program 147 3.4 调试方法 150 第四章 验证的计划 166 4.1 计划概述 166 4.2 计划的内容 173 4.3 计划的实现 185 4.4 计划的进程评估 194 第五章 验证的管理 277 6.1 验证的周期检查 277 6.2 管理三要素 291 6.3 验证的收敛 303 6.4 问题追踪 314 6.5 团队建设 321 6.6 验证的专业化 330 第六章 验证平台的结构 48 2.1 测试平台 49 2.2 硬件设计描述 55 MCDF接口描述 58 MCDF接口时序 62 MCDF寄存器描述 65 2.3 激励发生器 67 channel initiator 72 register initiator 73 2.4 监测器 74 2.5 比较器 81 2.6 验证结构 95 第七章 激励发生封装:类 209 5.1 概述 209 5.2 类的成员 233 5.3 类的继承 245 三种类型权限 protected/local/public 247 this super 253 成员覆盖 257 5.4 句柄的使用 263 5.5 包的使用 269 第八章 激励发生的随机化 340 7.1 随机约束和分布 340 权重分布 353 条件约束 355 7.2 约束块控制 358 7.3 随机函数 366 7.4 数组约束 373 7.5 随机控制 388 第九章 线程与通信 432 9.1 线程的使用 432 9.2 线程的控制 441 三个fork...join 443 等待衍生线程 451 停止线程disable 451 9.3 线程的通信 458 第十章 进程评估:覆盖率 495 10.1 覆盖率类型 495 10.2 功能覆盖策略 510 10.3 覆盖组 516 10.4 数据采样 524 10.5 覆盖选项 544 10.6 数据分析 550 第十一章 SV语言核心进阶 552 11.1 类型转换 552 11.2 虚方法 564 11.3 对象拷贝 575 11.4 回调函数 584 11.5 参数化的类 590 第十二章 UVM简介 392 8.2 UVM简介 414 8.3 UVM组件 420 8.4 UVM环境 425
### 回答1: 路科验证v0实验_lab3是一项涉及计算机网络的实验项目,主要目的是测试路科验证v0的性能和可靠性。这个实验项目的具体内容包括使用Java编写客户端和服务器端程序,并搭建一套基于TCP/IP协议的局域网。在这个局域网中,客户端通过向服务器端发送请求和接收响应来测试路科验证v0的性能。 在这个实验项目中,我们需要注意以下几个关键点: 1. 客户端和服务器端程序的编写:我们需要分别编写客户端和服务器端程序,并确保程序能够正常运行,包括正确处理请求和响应,并能够在网络环境中稳定地工作。 2. 协议和端口的规定:我们需要规定客户端和服务器端程序所使用的协议和端口,以确保它们能够正确地通信,并避免与其他程序冲突。 3. 性能和可靠性测试:我们需要通过对客户端和服务器端程序运行的测试来评估路科验证v0的性能和可靠性,包括响应时间、吞吐量、延迟等指标。 综上所述,路科验证v0实验_lab3是一项重要的计算机网络实验项目,能够有效测试和评估路科验证v0的性能和可靠性。在进行此项实验时,需要注意以上关键点,并严格按照实验要求进行操作。 ### 回答2: 路科验证v0实验_lab3,是针对机器学习中的线性回归模型进行的实验验证。这个实验主要目的是通过将数据集拆分成训练数据集和验证数据集,使用线性回归模型对训练数据进行拟合,评估模型的性能并进行调整。 通过该实验可以掌握以下内容: 1. 线性回归模型的原理和应用场景; 2. Python编程语言中的数据分析与预处理; 3. 使用Python中的sklearn库进行线性回归模型的建模及性能评估; 4. 如何使用数据可视化工具(Matplotlib)展示数据和模型效果。 在实验过程中,首先需要通过Python Pandas库读取数据,并对数据进行预处理,比如去除空数据和无关数据等。随后,需要将数据集分成训练数据集和验证数据集,通常是将80%的数据作为训练数据集,剩下的20%作为验证数据集。 接下来,需要对训练数据集进行拟合,使用sklearn库中的线性回归模型进行建模,并进行训练。最后,需要对模型进行性能评估,比如计算预测误差、均方误差以及R2评分等指标,以便确定是否需要对模型进行调整或优化。 最后,通过数据可视化工具展示模型效果,比如绘制散点图和回归直线,以便更好地理解模型效果和性能。 ### 回答3: 路科验证v0实验_lab3是一项机器学习实验。在这个实验中,我们将使用Python编程语言和一些常见的机器学习框架,测试一个支持向量机(SVM)的性能。 SVM是一种流行的二元分类算法,可以用于分类和回归问题。它的基本思想是将数据点分为两个类别,然后找到一个可以区分这些类别的最佳超平面。 在这个实验中,我们将使用Python的Scikit-learn库来实现SVM分类器,并且将使用UCI加州大学伊利诺伊热那亚分校提供的人体运动数据集来进行实验。 这个数据集包含大约7,352个样本,每个样本包含17个测量值和一个类别标签,表示人体在进行某些特定运动时的状态。我们将使用这个数据集来测试SVM分类器在数据集上的准确性。 具体实验流程为: 1. 加载数据集 2. 数据预处理 3. 划分数据集(训练集和测试集) 4. 对训练集进行标准化处理 5. 使用Scikit-learn库构建SVM分类器 6. 使用模型进行预测 7. 计算准确率和精确率 为了验证实验结果的可信度,我们将对数据集进行十次交叉验证,以确保得到的结果是准确的。 总之,这项实验旨在测试机器学习算法SVM在人体运动数据集上的性能,以评估该算法在实际应用中的效果,并探讨机器学习在运动领域的应用前景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值