芯片验证V0课程lab2-lab3 笔记总结_芯片验证v0资料-程序员宅基地

技术标签: systemverilog  

  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。


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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiujiusousou/article/details/104506715

智能推荐

ArcGIS API for Javascript加载各种来源的wms和wmts服务_arcgis js api wmts-程序员宅基地

文章浏览阅读1.5k次。1、加载wmts服务-使用WebTileLayer方式加载2、加载wms图层-使用BaseDynamicLayer方式加载_arcgis js api wmts

qt实现模拟路由器网络-建模课设_qt模拟实现小型城市组网-程序员宅基地

文章浏览阅读869次。说在前面首先,不是真的路由器,只是一些节点,但是使用的是OSPF协议,主要就是建立了一百多个节点,然后形成了一个连通图网络(深搜形成),接着找到最重要的十个节点(邻居最多的),最后输出这十个节点的路由表(老师的要求是路由表要有目的地,下一跳,以及路径长)。具有的功能直接看下面的截图就知道了。截图蓝色的就是最重要的十个节点这是十个路由器的路由表文件下一跳ip,目的地ip,路径,ip前三个数是乱写的,第四个是节点编号.h文件#ifndef MAINWINDOW_H#define MAINWI_qt模拟实现小型城市组网

python智慧交通大数据系统 实时监控 Flask框架 可视化(源码)_python技术在智慧交通大树后监控平台中的实时监控应用研究-程序员宅基地

文章浏览阅读905次,点赞23次,收藏11次。python智慧交通大数据系统 实时监控 Flask框架 可视化(源码)_python技术在智慧交通大树后监控平台中的实时监控应用研究

浅谈“三层结构”原理与用意(转帖)-程序员宅基地

文章浏览阅读78次。浅谈“三层结构”原理与用意序在刚刚步入“多层结构”Web应用程序开发的时候,我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。2005年2月11日,Bincess BBS彬月论坛开始试运行。不久之后,我写了一篇题目为《浅谈“三层结构”原理与用意》的文章。旧版文...

RITSEC CTF2021 Forensics1597题解记录-程序员宅基地

文章浏览阅读300次。题目地址:http://git.ritsec.club:7000/1597.git/这是一道与git版本管理有关的题目解题过程:一、很明显第一步将远程仓库克隆到本地git clone http://git.ritsec.club:7000/1597.git/其中一共有两个文件打开后发现flag.txt为空文件,README.md文件显示:# 1597A git challenge series? Sounds fun.没有用!!!二、推测(看大佬WP)查看版本记录。1.mkdir ki_ritsec

ssm 课程资源库APP 计算机毕设源码23834-程序员宅基地

文章浏览阅读70次。主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等:详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。本课程资源库APP采用的数据库是Mysql,使用Java技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点......

随便推点

Elasticsearch的基础概念和配置实战-程序员宅基地

文章浏览阅读3.7k次。作者:禅与计算机程序设计艺术 1.简介Elasticsearch是一个开源分布式搜索及分析引擎,主要面向云计算环境和实时应用场景。在互联网行业中扮演着越来越重要的角色,从而影响到各个领域,包括IT、电子商务、金融、搜索等。本文将以实战的方式,带领读者了解Elastic Stack(El

Python入门实战:Python的人工智能应用-程序员宅基地

文章浏览阅读11次。1.背景介绍Python是一种高级、通用、解释型的编程语言,它具有简单易学、高效开发、可读性强等优点,因此在各个领域得到了广泛应用。在人工智能领域,Python也是最受欢迎的编程语言之一。Python的人工智能库和框架丰富,包括NumPy、Pandas、Scikit-learn、TensorFlow、PyTorch等,这些库和框架提供了丰富的功能和强

uni-app 开发微信小程序 自定义tabBar_uniapp iconpath-程序员宅基地

文章浏览阅读1.4k次。uni-app 微信小程序 自定义tabBar 底部导航_uniapp iconpath

wordpress 自定义_在WordPress中创建自定义的“降雪”设计-程序员宅基地

文章浏览阅读327次。wordpress 自定义In December 2012, the New York Times broke out of their standard online post layout and wowed us with John Branch’s beautiful “Snow Fall” article. Instead of simply containing headings, t..._wordpress have_rows

C语言如何输入带空格的字符串?_c语言输入带空格的字符串-程序员宅基地

文章浏览阅读3.6w次,点赞84次,收藏201次。C/C++输入带空格的字符串_c语言输入带空格的字符串

MySQL DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci utf8mb4_bin utf8mb4_general_ci-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏40次。在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下:CREATE TABLE `table1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1', `field2` varchar(128) COLLATE ..._collate=utf8mb4_unicode_ci

推荐文章

热门文章

相关标签