关于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;
	end

always @(posedge clk)
	begin
		sampale_data<=data;
		data_rec<={data_rec[6:0],data};
	end

initial 
	begin
		clk=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;
	end

always @(posedge clk)
	begin
		sampale_data<=data;
		data_rec<={data_rec[6:0],data};
	end

initial 
	begin
		clk=0;
		forever #5 clk=~clk;
		
	end
endmodule

更改的地方主要有两点:

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

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

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

相关推荐
NamoAmitabha1287 天前
sequence.sv路科验证--deepseek
systemverilog·uvm
NamoAmitabha12814 天前
第2章:一个简单的UVM验证平台 —— 这是全书的精华!--deepseek
systemverilog·uvm
NamoAmitabha12814 天前
书中2.2.4virtual interface,config_db机制---deepseek
systemverilog·uvm
NamoAmitabha12820 天前
UVM在时间维度上也做了规范,phase机制----deepseek讲解
systemverilog·uvm
NamoAmitabha12820 天前
SystemVerilog 中的 :: 作用域解析运算符详解--deepseek讲解
systemverilog·uvm
NamoAmitabha12822 天前
class基础+继承的专项训练
systemverilog
NamoAmitabha12822 天前
rand/randc/constraint 练习
systemverilog
Salt & Light1 个月前
UVM 字段自动化 Field Automation:让打印、复制、比较自动化
学习·systemverilog·uvm
北方孤寂的灵魂2 个月前
关于AXI协议详解
verilog·systemverilog·sv·数字验证
Salt & Light3 个月前
SV基础之连接设计和测试平台
systemverilog