当前位置: 首页 > 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打印结果分析,这样写激励是正确的。

相关文章:

  • 第三十八节:视频处理-视频保存
  • 线程调度与单例模式: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:高效动态数组的深度解析(从使用到模拟实现)
  • 可显著提高公交出行率,山东、浙江多县常态化实施城区公交免费
  • 李根读《野兽之魂》|拨开高深的布幔,直窥历史的复杂
  • 王楚钦球拍检测环节受损,国际乒联发声明
  • 特朗普与普京开始电话会谈,稍后将致电泽连斯基
  • 最高法:依法惩治损害民营企业合法权益的串通投标行为
  • 海南保亭警方通报“两飞车党紧追女童”:两名初中生认错道歉