SystemVerilog 教程第二章数据类型:队列

news2024/11/26 21:46:21

SystemVerilog 队列

SystemVerilog queue(队列)是一种 First In First Out(先入先出)方案,您可为其设置变量大小,用于存储相同数据类型的各种元素。

它与一维解包阵列类似,同样可以自动伸缩调整大小。队列和一维解包阵列均可通过索引、并置和分片运算符来进行操纵。队列可作为 ref(参考)实参或 non-ref(非参考)实参来传递给任务/函数。

语法和用法

队列根据其大小规格使用 $ 运算符来加以区分。

[data_type]  [name_of_queue] [$];

string       name_list [$];        // A queue of string elements
bit [3:0]    data [$];             // A queue of 4-bit elements

logic [7:0]  elements [$:127];     // A bounded queue of 8-bits with maximum size of 128 slots

int  q1 [$] =  { 1, 2, 3, 4, 5 };  // Integer queue, initialize elements
int  q2 [$];                       // Integer queue, empty
int  tmp;                          // Temporary variable to store values

tmp = q1 [0];            // Get first item of q1 (index 0) and store in tmp
tmp = q1 [$];            // Get last item of q1 (index 4) and store in tmp
q2  = q1;                // Copy all elements in q1 into q2
q1  = {};                // Empty the queue (delete all items)

q2[2] = 15;              // Replace element at index 2 with 15
q2.insert (2, 15);       // Inserts value 15 to index# 2
q2 = { q2, 22 };         // Append 22 to q2
q2 = { 99, q2 };         // Put 99 as the first element of q2
q2 = q2 [1:$];           // Delete first item
q2 = q2 [0:$-1];         // Delete last item
q2 = q2 [1:$-1];         // Delete first and last item

SystemVerilog 队列示例

module tb;
    // Create a queue that can store "string" values
    string   fruits[$] =  { "orange", "apple", "kiwi" };

    initial begin
        // Iterate and access each queue element
        foreach (fruits[i])
            $display ("fruits[%0d] = %s", i, fruits[i]);

        // Display elements in a queue
        $display ("fruits = %p", fruits);

        // Delete all elements in the queue
        fruits = {};
        $display ("After deletion, fruits = %p", fruits);
    end
endmodule

仿真 log 日志

ncsim> run
fruits[0] = orange
fruits[1] = apple
fruits[2] = kiwi
fruits = '{"orange", "apple", "kiwi"}
After deletion, fruits = '{}
ncsim: *W,RNQUIE: Simulation is complete.

什么是分片表达式?

分片表达式用于选择现有变量中的一小部分。队列元素可使用分片表达式来进行选择,如以下示例所示。

部分仿真器会提供不同的结果,因此建议使用队列方法。
module tb;
    // Create a queue that can store "string" values
    string   fruits[$] =  { "orange", "apple", "lemon", "kiwi" };

    initial begin
        // Select a subset of the queue
        $display ("citrus fruits = %p", fruits[1:2]);

        // Get elements from index 1 to end of queue
        $display ("fruits = %p", fruits[1:$]);

        // Add element to the end of queue
        fruits[$+1] = "pineapple";
        $display ("fruits = %p", fruits);

        // Delete first element
        $display ("Remove orange, fruits = %p", fruits[1:$]);
    end
endmodule

仿真 log 日志

Compiler version J-2014.12-SP1-1; Runtime version J-2014.12-SP1-1;  May 15 16:21 2018
citrus fruits = '{"apple", "lemon"} 
fruits = '{"apple", "lemon", "kiwi"} 
fruits = '{"orange", "apple", "lemon", "kiwi", "pineapple"} 
Remove orange, fruits = '{"apple", "lemon", "kiwi", "pineapple"} 
           V C S   S i m u l a t i o n   R e p o r t

队列方法

队列方法示例

除阵列运算符外,队列还可提供多种内置方法。

函数描述
function int size ();返回队列中的项数如为空,则返回 0
function void insert (input integer index, input element_t item);在指定索引位置插入给定的项
function void delete ( [input integer index] );删除指定索引处的元素,如果不提供此项元素,则将删除所有元素
function element_t pop_front ();移除并返回队列的首个元素
function element_t pop_back ();移除并返回队列的最后一个元素
function void push_front (input element_t item);在队列前插入给定元素
function void push_back (input element_t item);在队列末插入给定元素
module tb;
    string fruits[$] = {"apple", "pear", "mango", "banana"};

    initial begin
        // size() - Gets size of the given queue
        $display ("Number of fruits=%0d   fruits=%p", fruits.size(), fruits);

        // insert() - Insert an element to the given index
        fruits.insert (1, "peach");
        $display ("Insert peach, size=%0d fruits=%p", fruits.size(), fruits);

        // delete() - Delete element at given index
        fruits.delete (3);
        $display ("Delete mango, size=%0d fruits=%p", fruits.size(), fruits);

        // pop_front() - Pop out element at the front
        $display ("Pop %s,    size=%0d fruits=%p", fruits.pop_front(), fruits.size(), fruits);

        // push_front() - Push a new element to front of the queue
        fruits.push_front("apricot");
        $display ("Push apricot, size=%0d fruits=%p", fruits.size(), fruits);

        // pop_back() - Pop out element from the back
        $display ("Pop %s,   size=%0d fruits=%p", fruits.pop_back(), fruits.size(), fruits);

        // push_back() - Push element to the back
        fruits.push_back("plum");
        $display ("Push plum,    size=%0d fruits=%p", fruits.size(), fruits);
    end
endmodule

仿真 log 日志

ncsim> run
Number of fruits=4   fruits='{"apple", "pear", "mango", "banana"}
Insert peach, size=5 fruits='{"apple", "peach", "pear", "mango", "banana"}
Delete mango, size=4 fruits='{"apple", "peach", "pear", "banana"}
Pop apple,    size=3 fruits='{"peach", "pear", "banana"}
Push apricot, size=4 fruits='{"apricot", "peach", "pear", "banana"}
Pop banana,   size=3 fruits='{"apricot", "peach", "pear"}
Push plum,    size=4 fruits='{"apricot", "peach", "pear", "plum"}
ncsim: *W,RNQUIE: Simulation is complete.

如何在 SystemVerilog 中创建类队列?

// Define a class with a single string member called "name"
class Fruit;
  string name;

  function new (string name="Unknown");
    this.name = name;
  endfunction
endclass

module tb;
  // Create a queue that can hold values of data type "Fruit"
  Fruit list [$];

  initial begin
    // Create a new class object and call it "Apple"
    // and push into the queue
    Fruit f = new ("Apple");
    list.push_back (f);

    // Create another class object and call it "Banana" and
    // push into the queue
    f = new ("Banana");
    list.push_back (f);

    // Iterate through queue and access each class object
    foreach (list[i])
      $display ("list[%0d] = %s", i, list[i].name);

    // Simply print the whole queue, note that class handles are printed
    // and not class object contents
    $display ("list = %p", list);
  end
endmodule

仿真 log 日志

ncsim> run
list[0] = Apple
list[1] = Banana
list = '{$unit_0x4ccdf83b::Fruit@2_1, $unit_0x4ccdf83b::Fruit@4_1}
ncsim: *W,RNQUIE: Simulation is complete.

如何在 SystemVerilog 中创建动态阵列队列?

动态阵列队列

// Declare a dynamic array to store strings as a datatype
typedef string str_da [];

module tb;
  // This is a queue of dynamic arrays
  str_da list [$];

  initial begin
    // Initialize separate dynamic arrays with some values
    str_da marvel = '{"Spiderman", "Hulk", "Captain America", "Iron Man"};
    str_da dcWorld = '{"Batman", "Superman" };

    // Push the previously created dynamic arrays to queue
    list.push_back (marvel);
    list.push_back (dcWorld);

    // Iterate through the queue and access dynamic array elements
    foreach (list[i])
      foreach (list[i][j])
        $display ("list[%0d][%0d] = %s", i, j, list[i][j]);

    // Simply print the queue
    $display ("list = %p", list);
  end
endmodule

仿真 log 日志

ncsim> run
list[0][0] = Spiderman
list[0][1] = Hulk
list[0][2] = Captain America
list[0][3] = Iron Man
list[1][0] = Batman
list[1][1] = Superman
list = '{'{"Spiderman", "Hulk", "Captain America", "Iron Man"}, '{"Batman", "Superman"}}
ncsim: *W,RNQUIE: Simulation is complete.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix 6.0 监控LNPM环境

这里的LNPM是指Linux,Nginx,php-fpm和Mysql.具体版本如下。 Linux : centos7.9Nginx: 1.22.1php-fpm:7.4Mysql: 8.0 一、centos7.9 编译安装Nginx 为了弄清楚Nginx各种配置,我们采用编译安装的形式部署Nginx。 1.下载安装包 首先下载Nginx软件包&am…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上,但实事时类相互嵌套,非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

简单认识数据库用户管理

文章目录 一、数据库用户管理1、新建用户(1)创建用户使用明文设置密码(2)获取密文再给新用户设置密码(3)查看数据库用户和其他信息(4)查看当前登录用户信息 2.修改数据库用户相关信息…

漏洞复现-CVE-2023-33246 Apache RocketMQ RCE漏洞原理与复现

目录 漏洞原理漏洞描述影响范围 Apache RocketMQ学习文档学习代码审计 漏洞复现docker环境搭建exp代码 总结参考 漏洞原理 漏洞描述 For RocketMQ versions 5.1.0 and below, under certain conditions, there is a risk of remote command execution. Several components of…

Wine的调试方法

wine的运行管理 # 运行exe程序 wine <exe程序># 运行msi程序 wine msiexec /i <msi程序> wine start <msi程序># 静默安装 wine <exe程序> /q /doNotRequireDRMPrompt /noupdate# 杀掉wine进程 wineserver -k pkill wine配置wine 配置环境变量 # 配…

GD32f103系列外部晶振更改

GD32f103系列的芯片现在基本很普通了&#xff0c;外部很多资料都是使用8MHz晶振为CPU提供主频。很多的时候由于项目的原因&#xff0c;外部晶振会更换不同的频率&#xff0c;有4MHz或者12Mhz的&#xff0c;因此需要在系统文件中做一些更改。 以8MHz晶振转12MHz晶振为例&#x…

Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)

Redis系列文章 Redis&#xff08;一&#xff09;原理及基本命令&#xff08;柔性数组&#xff09; Redis&#xff08;二&#xff09;网络协议和异步方式&#xff08;乐观锁&悲观锁&#xff09; Redis&#xff08;三&#xff09;存储原理与数据模型&#xff08;hash冲突、渐…

chatGPT指令大全可免费使用网站列表chatGPT4试用方案

指令列表 写作助理 &#x1f449; 最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。作为一名中文写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff0c;减少…

【CesiumJS入门】(7)绘制多段线(动态实时画线)

前言 鼠标左键添加点、右键完成绘制,单击右侧弹窗关闭按钮清空绘制。参考沙盒示例&#xff1a;Drawing on Terrain 直接上代码了 /** Date: 2023-07-12 18:47:18* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-16 16:26:19* FilePath: \cesium-tyro-blog\s…

【动手学深度学习】--07.数值稳定性、模型初始化、激活函数

文章目录 数值稳定性、模型初始化、激活函数1.数值稳定性1.1举例1.2数值稳定性的常见两个问题1.3梯度爆炸1.4梯度消失1.5打破对称性 2.模型初始化2.1让训练更加稳定2.2权重初始化2.3Xavier初始 3.激活函数 数值稳定性、模型初始化、激活函数 学习视频&#xff1a;数值稳定性 …

vue3后台管理系统实现动态侧边导航菜单管理(ElementPlus组件)

记住 一级(el-sub-menu)的都是只是展示的 点击跳转的都是一级下的子级(el-menu-item) 完整展示 1:在登陆功能进行登陆 获取menu列表 注册路由表的时候 把文件进行创建好 因为注册的方法需要获取这个路径 整个router下的main product等等都要创建 //1:发送你的用户名和密码获…

Linux--进程终止

一、进程终止时&#xff0c;操作系统做了什么&#xff1f;&#xff1f; 释放进程申请的相关内核数据结构和对应的代码和数据 本质就是释放系统资源&#xff08;最主要的资源是内存&#xff09; 二、进程终止的常见方式&#xff1f; a.代码跑完&#xff0c;结果正确 b.代码跑完&…

【我的2023上半年总结】感谢CSDN:第一次100w+阅读,赚大了!

大家好&#xff0c;这里是程序员晚枫。 因为工作一般都是996的原因&#xff0c;今天是2023上半年少有的周六休息日&#xff0c;正好看到平台的#2023年中总结#活动&#xff0c;赶紧来分享一下这半年的自媒体收获~ 主要说一些开心的事情 1、CSDN CSDN账号&#x1f449;Python…

MySQL的循环语句分析

1.while循环 复制 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQL语句 DELIMITER //DROP PROCEDURE if EXISTS &lsquo;test&rsquo;; # 如果存在test存储过程则删除CREATE procedure test() # 创建无参存储过程,名称为testBEGIN DECLARE i I…

配置 Vite 的环境变量与模式 (.env mode)

目录 创建项目环境变量内建变量创建.env 文件定义变量HTML 环境变量替换 模式 创建项目 npm create vitelatest or yarn create vite or pnpm create vite 环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。 console.log(import.meta.env)内建变量 import.met…

关于chatGPT、AI绘画、AI提词器等AI工具国内如何使用

目前的AI潮流非常火热&#xff0c;OPENAI 出的CHATGPT可谓是目前大模型人工智能的代表&#xff0c;刚开始听说chatGPT可以写代码&#xff0c;写作&#xff0c;写方案&#xff0c;无所不能。还有AI绘画也很&#xff2e;&#xff22;作为一个程序员&#xff0c;为了体验这些&…

python+pytest接口自动化之参数关联

目录 一. 参数关联场景 二. 脚本编写 1. 在用例中按顺序调用 2. 使用Fixture函数 三. 总结 什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&…

听GPT 讲K8s源代码--pkg(三)

在 Kubernetes 项目中&#xff0c;pkg/controller目录下的子目录通常包含控制器相关的代码和逻辑。控制器是 Kubernetes 中用于管理资源的核心组件之一。它们负责监控资源的状态&#xff0c;并确保其符合所定义的期望状态。下面是对这些子目录的一些常见作用的解释&#xff1a;…

JavaScript中数据类型

对象和原始值 ● 在JavaScript中&#xff0c;有两种主要类型的数据&#xff0c;要不是原始值&#xff0c;要不是对象&#xff1b; 7种原始数据类型 1.数字 浮点数用于小数和整数。let age 23; 2.字符串 一系列字符的序列&#xff0c;用于文本。let firstName “IT知识…

全网最全整理,Allure集成Jenkins自动化测试实战(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Allure插件安装 …