刚刚开始用task,请指教有没有错误(已经解决,设全局变量)
时间:10-02
整理:3721RD
点击:
task AHB_master_assignment
(
input integer delay1,
input integer delay2,
input [7:0] idata,
input ivld,
output [7:0] o_data,
output o_vld
);
begin
@(posedge clk)
#delay1
o_data = idata;
//command
o_vld = ivld;
#delay2
@(posedge clk)
#delay1
o_data = 8'b0;
o_vld = 1'b0;
end
endtask
////////////////////////////////////////////////////////////////////////////////
// 调用task, cmd_data和cmd_data_vld是我希望的输出,clk是系统时钟
////////////////////////////////////////////////////////////////////////////////
AHB_master_assignment(1,10,8'b10101010,1'b1,cmd_data,cmd_data_vld);
刚刚学习用task,请问有错么?
仿真了一下,发现 cmd_data,cmd_data_vld的值一直是0
请问,哪里出错了呢?
呵呵,贻笑大方了,逻辑错误,呵呵,应该设为全局变量
请注意task的verilog官方说明,task中的output是在task执行结束的时刻赋值。也就是说output只返回task 运行结束时点的值。你要想实现task对一个变量(记住是reg类型)赋值并要想实时反映你的赋值信息,那就要在task体外面对这个变量进行声明。
reg a;
task con_a;
@(posedge clk) a =1;
#100;
@(posedge clk) a=0;
endtask
请注意task的verilog官方说明,task中的output是在task执行结束的时刻赋值。也就是说output只返回task 运行结束时点的值。你要想实现task对一个变量(记住是reg类型)赋值并要想实时反映你的赋值信息,那就要在task体外面对这个变量进行声明。
reg a;
task con_a;
@(posedge clk) a =1;
#100;
@(posedge clk) a=0;
endtask
长见识了!一直没有这么深入的了解这个task
老大,应该早点说,呵呵呵,我花费了n久找错误,然后找到了,然后你回复了哦,呵呵
我也受益。THX
受教了!
非常有用,非常感谢!
受教了。
