当前位置: 首页 > article >正文

关于systemverilog中在task中使用force语句的注意事项

先看下面的代码

module  top(data);logic clk;
inout data;
logic temp;
logic sampale_data;
logic [7:0] data_rec;task  send_data(input  [7:0] da);begin@(posedge clk);#1;force 	 data=da[7];$display(data);@(posedge clk);#1;force	 data=da[6];	$display(data);		@(posedge clk);#1;force	 data=da[5];$display(data);@(posedge clk);#1;force	 data=da[4];$display(data);@(posedge clk);#1;force	 data=da[3];	$display(data);@(posedge clk);#1;force	 data=da[2];$display(data);@(posedge clk);#1;force	 data=da[1];$display(data);@(posedge clk);#1;force	 data=da[0];	$display(data);end
endtask
initial begin#1000;@(negedge clk);send_data(8'b1100_1100);$stop;send_data(8'b0011_0011);$stop;endalways @(posedge clk)beginsampale_data<=data;data_rec<={data_rec[6:0],data};endinitial beginclk=0;forever #5 clk=~clk;end
endmodule

仿真波形结果如下:

        在第一次调用send_data(8'b1100_1100);后,最后一个比特输出应该是0,但是从仿真波形看是1,这是因为第一次调用send_data(8'b1100_1100)时,最后一次force后,task任务立即退出,执行第二次调用send_data(8'b0011_0011);第二次调用task会将第一次调用task的force语句赋值覆盖。但是第二次调用task的第一次force是在时钟上升沿之后,而且强制赋值也是0,不明白为什么仿真波形中标记红色的显示为1。通过$display打印出每次force赋值后的值是正确的。目前尚不清楚原因。

        通过sampale_data对data进行采样发现,采集的数据错误。所以按照上面的方法写的激励不对。

        为了解决上述问题,将上述代码更改如下:

module  tb(data);logic clk;
inout data;
logic temp;
logic sampale_data;
logic [7:0] data_rec;task  send_data(input  [7:0] da);begin@(negedge clk);#1;force 	 data=da[7];$display(data);@(negedge clk);#1;force	 data=da[6];	$display(data);		@(negedge clk);#1;force	 data=da[5];$display(data);@(negedge clk);#1;force	 data=da[4];$display(data);@(negedge clk);#1;force	 data=da[3];	$display(data);@(negedge clk);#1;force	 data=da[2];$display(data);@(negedge clk);#1;force	 data=da[1];$display(data);@(negedge clk);#1;force	 data=da[0];	$display(data);#7;
/* 		@(posedge clk);release data; */end
endtask
initial begin#1000;@(negedge clk);send_data(8'b1100_1100);//@(posedge clk);$stop;send_data(8'b0011_0011);release data;$stop;endalways @(posedge clk)beginsampale_data<=data;data_rec<={data_rec[6:0],data};endinitial beginclk=0;forever #5 clk=~clk;end
endmodule

更改的地方主要有两点:

(1)在时钟的下降沿使用force强制赋值。

(2)在task中最后一次force时,延时时间大于时钟周期的一半,小于一个时钟周期。

通过仿真波形,以及$display打印结果分析,这样写激励是正确的。

http://www.lryc.cn/news/2380006.html

相关文章:

  • Python Day26 学习
  • 解决:npm install报错,reason: certificate has expired
  • 卸载云枢(MacOS 版)
  • 中科固源Wisdom平台发现NASA核心飞行控制系统(cFS)通信协议健壮性缺陷!
  • Linux内核深入学习(4)——内核常见的数据结构2——红黑树
  • 从单体架构到微服务:架构演进之路
  • 嵌入式学习笔记DAY23(树,哈希表)
  • leetcode239 滑动窗口最大值deque方式
  • 仓颉开发语言入门教程:搭建开发环境
  • Axure中继器高保真交互原型的核心元件
  • 【SpringBoot】✈️整合飞书群机器人发送消息
  • 第 1 章:数字 I/O 与串口通信(GPIO UART)
  • 【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
  • java配置webSocket、前端使用uniapp连接
  • interface接口和defer场景分析
  • 02、基础入门-Spring生态圈
  • 前后端交互中的绝对路径和相对路径
  • 从零开始学习three.js(18):一文详解three.js中的着色器Shader
  • 调用百度云API机器翻译
  • 大模型训练计算显存占用
  • uni-app学习笔记六-vue3响应式基础
  • 亚远景-ASPICE与ISO 21434在汽车电子系统开发中的应用案例
  • 『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle
  • 详细介绍一下Python连接MySQL数据库的完整步骤
  • 【Unity 2023 新版InputSystem系统】新版InputSystem 如何进行人物移动(包括配置、代码详细实现过程)
  • 单片机-STM32部分:13-1、编码器
  • 机器学习第十二讲:特征选择 → 选最重要的考试科目做录取判断
  • 关于我在使用stream().toList()遇到的问题
  • javascript 编程基础(2)javascript与Node.js
  • Spring Boot 集成 druid,实现 SQL 监控