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

关于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.dtcms.com/a/201179.html

相关文章:

  • 第三十八节:视频处理-视频保存
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • 麦克风与扬声器的关键区别 [特殊字符]
  • SpringBoot+ELK 搭建日志监控平台
  • 前端 vue + element-ui 框架从 0 - 1 搭建
  • Spring Cloud Seata 快速入门及生产实战指南
  • antd树结构
  • 阻塞队列:线程安全与生产者消费者模型解析
  • OSPF路由撤销及优化
  • solana钱包管理模块
  • 自动化测试的框架有哪些?原理是什么?
  • 判断三方库是64位还是32位
  • IEEE Communications Magazine 2025年1-3月论文速览
  • 【调制识别】PGD攻击中参数的含义
  • ArkUI Tab组件开发深度解析与应用指南
  • lowcoder数据库操作2:新建数据库查询
  • Java:logback-classic与slf4j版本对应关系
  • 实战手册--如何针对衡石分析平台的数据集成详解
  • EmoBox:我与 CodeBuddy 共创的 Emoji 表情分类小工具
  • 【C++篇】揭秘STL vector:高效动态数组的深度解析(从使用到模拟实现)
  • 从技术层⾯来说深度SEO优化的⽅式有哪些?
  • Java 中Supplier延迟生成值的原因
  • 2025-5-19Vue3快速上手
  • java.lang.UnsupportedOperationException: null
  • 【java第18集】java引用数据类型详解
  • 进程退出 和 僵尸进程、孤儿进程
  • Linux错误处理集合 GLIBCXX_3.4.25‘ not found和 安装glibc-2.28和Error: rpmdb open failed
  • JQuery 禁止页面滚动(防止页面抖动)
  • VS中将控制台项目编程改为WINDOWS桌面程序
  • ai决策平台:AnKo如何推动引领智能化未来?