芯片验证V0课程lab2-lab3 笔记总结

  1. SystemVerilog常用的随机函数
    (1) $random() -----平均分布,返回32位有符号随机数;
    (2) $urandom()-----平均分布,返回32位无符号随机数;
    (3) $urandom_range(int unsigned max,int unsigned min)-----平均分布,在(min,max)范围中返回无符号随机数。
    例如lab2代码中:
logic [7:0]payload[$];
repeat($urandom_range(4,2))
	payload.push_back($urandom);

第一句是声明队列payload;第二句是通过$urandom_range()函数生成重复次数,这里是随机生成{2,3,4};第三句是通过 $urandom()函数产生一个32位无符号随机数,由于payload声明为8bit,所以通过push_back每次向payload队列中添加一个8bit的数据。

  1. fork- join
    fork-join 结构可以使得其内部语句并行执行。例如lab3代码中:
fork
	send();//进程1
	recv();//进程2
join

fork-join中的send()和recv()会并行执行。
另外还有fork-join_any,该结构会在其内部任何一个进程完成时退出并行,执行后续代码。例如lab3代码中:

fork : frameo_wd_timer
	@(negedge rtr_io.cb.frameo_n[da])//进程1
		;//空语句
	begin //进程2
		repeat (1000) @(rtr_io.cb);
			...
	end
join_any
disable fork;//杀死所有与之最近的fork中的进程

该部分代码是为了防止仿真器等待不到frameo_n信号的下降沿,从而导致无法退出task get_payload(),进而陷入recv()死循环。 采用fork-join_any会在进程1或者进程2完成时退出,防止仿真出错。
此外还有 fork-join_none结构,该结构不会等待其内部进程完成,直接执行后续的代码。
链接: link.中对这三种结构进行了详细的介绍。
disable fork;语句会杀死与之最近的fork中的代码,即fork:frameo_wd_timer。
与之对应的是wait fork;语句会引起调用的进程阻塞直到所有进程完成,常用于确保所有子进程全部执行结束。

  1. get_payload数据采集过程
    lab3任务get_payload部分代码如下:
  task get_payload();
    pkt2cmp_payload.delete();
    ...//省略部分代码
    forever begin
      logic[7:0] datum;
      for(int i=0; i<8; i=i)  begin //i=i prevents VCS warning messages
        if(!rtr_io.cb.valido_n[da])
			datum[i++] = rtr_io.cb.dout[da];
        if(rtr_io.cb.frameo_n[da])	begin
			if(i==8) begin //byte alligned
				pkt2cmp_payload.push_back(datum); //用于采集队列中最后一个byte数据
				return;      //done with payload    跳出task get_payload  结束数据采集
			end
			else begin
			  $display("\n%m\n[ERROR]%t Packet payload not byte aligned!\n", $realtime);
			  $finish;
			end
		end
        @(rtr_io.cb);
      end
      pkt2cmp_payload.push_back(datum);//用于采集除最后一个byte数据之外的数据,之后继续执行forever中的语句
    end
  endtask: get_payload

首先第一个问题:为何在for中采用i=i,循环语句中为i++?
这是因为是实际运行中valid_n信号可能会存在为“1”的情况,此时if语句不成立,数据不会被采集到datum中,如果采用for(i=0,i<8,i++)在循环体中其他语句执行之后i会加一,导致datum[i]采集不到准确的数据。而采用for(i=0,i<8,i=i),当if语句成立时会采集数据并i++,这就防止了在采集过程中valid_n信号为“1”所导致数据不准确。
第二个问题: pkt2cmp_payload.push_back(datum);语句为何出现了两次?
在之前payload()中repeat了{2,3,4},那么一个数据包最多会有4byte数据,这里假设产生了4byte数据,那么前3个byte数据时frameo_n信号一直为0,所以不会执行if语句,当i=8时跳出for循环执行第二个 pkt2cmp_payload.push_back(datum);语句将采集到的数据存入队列get_payload中。当采集第4byte数据时,frameo_n会在i=8时置“1”(由设计文档得出)此时进入if语句,由第一个 pkt2cmp_payload.push_back(datum);语句将采集到的数据存入队列get_payload中,至此4个byte数据都采集到队列get_payload中,最后通过return 跳出forever,完成get_payload。

4.$ sformatf系统函数
该函数标准格式为:$sformatf(format,arge) ,将参数arge按照格式填入format中,组成的字符串作为函数的返回值。lab3代码中:

if(payload.size() != pkt2cmp_payload.size()) begin
      message = "Payload size Mismatch:\n";
      message = { message, $sformatf("payload.size() = %0d, pkt2cmp_payload.size() = %0d\n", payload.size(), pkt2cmp_payload.size()) };
      return (0);
    end

$sformatf将payload.siz与pkt2cmp_payload.size分别填入两个%0d中,得到的字符串作为函数的返回值,并与message拼接组成新的message。在后续代码中通过 $display函数打印。
拓展1:
$sformat(str,format,arge)与 $是formatf类似,只不过是将字符串赋值给str,并没有作为函数返回值。例如:

string a;
$sformatf(a,"test=%0d",i);

假设 i=8,那么a=“test=8”。
拓展2:
$sscanf(str,format,arge);将字符串按照format规定的模板进行扫描,即将stdin中输入的字符串赋值给str。
拓展3:
$display(format,arge);将参数arge填入format中并打印显示到stdout。


初次学习,可能会有错误的地方,仅供参考。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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在人体运动数据集上的性能,以评估该算法在实际应用中的效果,并探讨机器学习在运动领域的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值