做淘宝网站怎么弄阳江一中启业网
2026/1/24 9:43:52 网站建设 项目流程
做淘宝网站怎么弄,阳江一中启业网,WordPress全屏轮播图,虎丘苏州网站建设近期在写功能模块的sv-ref_model时#xff0c;想到使用队列来实现会方便很多#xff0c;搜索队列的使用会有很多帖子#xff0c;自己也是在前辈的基础上稍作总结#xff0c;作为自己的记录#xff0c;也供后续参考。一、队列的核心概念队列是一种大小可动态调整的有序集合…近期在写功能模块的sv-ref_model时想到使用队列来实现会方便很多搜索队列的使用会有很多帖子自己也是在前辈的基础上稍作总结作为自己的记录也供后续参考。一、队列的核心概念队列是一种大小可动态调整的有序集合特点如下索引访问支持像数组一样用索引[0]、[1]…访问元素索引从 0 开始$表示最后一个元素的索引。高效增删在队列的头部和尾部添加 / 删除元素的时间复杂度为 O (1)比动态数组更高效。存储类型可以存储基础类型int、bit、byte、string或复杂类型类句柄、结构体。声明语法使用[$]标识格式为数据类型 队列名[$];。二、队列的基础操作核心下面通过代码示例展示队列的初始化、增删、访问、清空等基础操作这些是日常使用中最频繁的操作。1. 声明与初始化module test_queue; initial begin // 1. 声明空队列 int q1[$]; string q2[$]; // 2. 声明并初始化队列用{}赋值元素用逗号分隔 int q3[$] {10, 20, 30}; // 初始元素10、20、30 int q4[$] {40, 50, 60}; // 也可以用{}(SystemVerilog推荐写法) // 3. 打印队列%p是格式化打印复合类型的占位符 $display(q1空队列%p, q1); $display(q3%p, q3); $finish; end endmodule输出结果q1空队列{} q3{10, 20, 30}2. 元素的添加头部 / 尾部队列提供了专门的方法用于在头部 / 尾部添加元素也支持插入到指定位置module test_queue; initial begin int q[$] {1, 2, 3}; $display(初始队列%p, q); // 1. 尾部添加元素push_back最常用 q.push_back(4); // 队列变为{1,2,3,4} $display(push_back(4)后%p, q); // 2. 头部添加元素push_front q.push_front(0); // 队列变为{0,1,2,3,4} $display(push_front(0)后%p, q); // 3. 插入到指定索引位置insert(索引, 元素) q.insert(2, 99); // 在索引2的位置插入99队列变为{0,1,99,2,3,4} $display(insert(2,99)后%p, q); $finish; end endmodule输出结果初始队列{1, 2, 3} push_back(4)后{1, 2, 3, 4} push_front(0)后{0, 1, 2, 3, 4} insert(2,99)后{0, 1, 99, 2, 3, 4}3. 元素的移出/删除头部 / 尾部 / 指定位置module test_queue; initial begin int q[$] {0, 1, 99, 2, 3, 4}; $display(初始队列%p, q); // 1. 尾部移出元素pop_back返回被移出的元素 int val1 q.pop_back(); // 删除4val14队列变为{0,1,99,2,3} $display(pop_back后%p被删除元素%0d, q, val1); // 2. 头部移出元素pop_front返回被移出的元素 int val2 q.pop_front(); // 删除0val20队列变为{1,99,2,3} $display(pop_front后%p被删除元素%0d, q, val2); // 3. 删除指定索引的元素delete(索引) q.delete(1); // 删除索引1的99队列变为{1,2,3} $display(delete(1)后%p, q); // 4. 清空整个队列delete()无参数 q.delete(); // 队列变为空 $display(delete()后清空队列%p, q); $finish; end endmodule输出结果初始队列{0, 1, 99, 2, 3, 4} pop_back后{0, 1, 99, 2, 3}被删除元素4 pop_front后{1, 99, 2, 3}被删除元素0 delete(1)后{1, 2, 3} delete()后清空队列{}4. 元素的访问与长度获取module test_queue; initial begin int q[$] {10, 20, 30, 40}; // 1. 通过索引访问元素索引从0开始$表示最后一个元素 $display(索引0的元素%0d, q[0]); // 10 $display(最后一个元素q[$]%0d, q[$]); // 40 $display(倒数第二个元素q[$-1]%0d, q[$-1]); // 30 // 2. 获取队列长度size()方法 $display(队列长度%0d, q.size()); // 4 // 3. 修改指定索引的元素 q[1] 200; // 索引1的元素从20改为200 $display(修改后队列%p, q); // {10,200,30,40} $finish; end endmodule输出结果索引0的元素10 最后一个元素q[$]40 倒数第二个元素q[$-1]30 队列长度4 修改后队列{10, 200, 30, 40}三、队列的高级操作1. 队列的切片截取部分元素队列支持用[start:end]的切片语法截取指定范围的元素返回新的队列module test_queue; initial begin int q[$] {1, 2, 3, 4, 5}; // 1. 截取索引1到3的元素包含1和3 int q_slice1[$] q[1:3]; $display(q[1:3]%p, q_slice1); // {2,3,4} // 2. 截取从索引2到末尾的元素$表示最后一个索引 int q_slice2[$] q[2:$]; $display(q[2:$]%p, q_slice2); // {3,4,5} // 3. 截取前3个元素索引0到2 int q_slice3[$] q[0:2]; $display(q[0:2]%p, q_slice3); // {1,2,3} $finish; end endmodule2. 队列的拼接使用{}运算符可以将多个队列或单个元素拼接成新的队列module test_queue; initial begin int q1[$] {1, 2}; int q2[$] {3, 4}; // 1. 拼接两个队列 int q3[$] {q1, q2}; $display(q1q2%p, q3); // {1,2,3,4} // 2. 队列与单个元素拼接 int q4[$] {q1, 99, q2}; $display(q199q2%p, q4); // {1,2,99,3,4} // 3. 队列自身拼接复制两倍 int q5[$] {q1, q1}; $display(q1复制两倍%p, q5); // {1,2,1,2} $finish; end endmodule最近在调试ref_model时要实现最邻近插值就用到了队列拼接功能将一个队列q1复制两次拼接在原有队列q2后面实现语句q2{q2, q1, q1}; 这样的实现是不是很简明3. 队列的遍历foreach 循环使用foreach循环可以遍历队列的所有元素是处理队列数据的常用方式module test_queue; initial begin int q[$] {10, 20, 30, 40}; $display(遍历队列元素); foreach (q[i]) begin $display(索引%0d的元素%0d, i, q[i]); end // 遍历的同时修改元素比如所有元素乘2 foreach (q[i]) begin q[i] q[i] * 2; end $display(元素乘2后%p, q); // {20,40,60,80} $finish; end endmodule输出结果遍历队列元素 索引0的元素10 索引1的元素20 索引2的元素30 索引3的元素40 元素乘2后{20, 40, 60, 80}4. 复杂类型队列类句柄队列队列可以存储类的句柄常用于验证中存储事务对象如 AHB/AXI 事务注意需要使用深拷贝避免浅拷贝问题// 定义一个简单的事务类 class Trans; int data; // 深拷贝方法创建新对象并复制属性 function Trans copy(); copy new(); copy.data this.data; endfunction endclass module test_queue; initial begin Trans q[$]; // 声明类句柄队列 Trans t1, t2; // 初始化队列 t1 new(); t1.data 100; t2 new(); t2.data 200; q.push_back(t1); q.push_back(t2); $display(队列元素值%0d, %0d, q[0].data, q[1].data); // 100, 200 // 深拷贝添加新对象到队列避免浅拷贝 q.push_back(t1.copy()); q[2].data 999; // 修改新对象原对象不受影响 $display(修改后%0d原对象%0d新对象, t1.data, q[2].data); // 100, 999 $finish; end endmodule输出结果队列元素值100, 200 修改后100原对象999新对象队列的类型可以是常用的int、bit、byte、logic等也可以是自定义的类型那么队列中的每个元素都是一个自定义的变量。四、队列的常用场景验证中事务存储测试平台中存储生成的激励事务、监测到的总线事务如 AHB/AXI 的读写事务。数据缓冲在驱动器Driver和监视器Monitor中缓冲数据实现异步数据处理。动态数据处理需要频繁添加 / 删除元素的场景如过滤无效事务、排序事务。五、总结队列的核心特性SystemVerilog 队列是动态有序集合支持索引访问头部 / 尾部增删元素效率高声明用[$]。常用基础操作操作/方法说明添加push_back() 尾部添加push_front() 头部添加移出pop_back() 尾部移出pop_front() 头部移出清空delete() 删除整个队列delete(n) 删除指定位置的元素长度size() 整个队列内元素个数高级操作支持切片[start:end]、拼接{}、foreach遍历可存储基础类型和复杂类型类句柄需深拷贝。应用场景主要用于验证中的事务存储、数据缓冲和动态数据处理是 Testbench 编写的核心数据类型之一。有更多的使用方法和注意事项欢迎大家留言讨论。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询