testbench和RTL之间的时序问题
时间:10-02
整理:3721RD
点击:
module apb_task();
reg [31:0] rd_data;
task apb_read();
input [31:0] addr;
output [31:0] data;
begin
@(posedge CLK)
begin
PSEL <= 1'b1;
PWRITE <= 1'b0;
PADDR <= addr;
end
@(posedge CLK);
begin
PENABLE <= 1'b1;
end
@(posedge CLK)
begin
data <= PRDATA; //data=PRDATA;这里出现问题?
PSEL <= 1'b0;
PENABLE <= 1'b0;
end
end
endtaask
initial
begin
rd_data <= 32'h0;
apb_rd(32'h5,rd_data);
end
endmodule
为什么用非阻塞赋值返回的rd_data是xx(但是看波形,task内的data都是对的,就是rd_data是x),而用阻塞赋值是正确的值。
reg [31:0] rd_data;
task apb_read();
input [31:0] addr;
output [31:0] data;
begin
@(posedge CLK)
begin
PSEL <= 1'b1;
PWRITE <= 1'b0;
PADDR <= addr;
end
@(posedge CLK);
begin
PENABLE <= 1'b1;
end
@(posedge CLK)
begin
data <= PRDATA; //data=PRDATA;这里出现问题?
PSEL <= 1'b0;
PENABLE <= 1'b0;
end
end
endtaask
initial
begin
rd_data <= 32'h0;
apb_rd(32'h5,rd_data);
end
endmodule
为什么用非阻塞赋值返回的rd_data是xx(但是看波形,task内的data都是对的,就是rd_data是x),而用阻塞赋值是正确的值。
改为:
initial
begin
apb_rd(32'h5);
end
endmodule
然后,直接查看data试试
你是问这个,我是这么理解的
阻塞赋值是顺序赋值,所以你会看到最终值,即apb_rd(32'h5,rd_data);
而非阻塞赋值是同时,rd_data <= 32'h0;和apb_rd(32'h5,rd_data);同时赋值给rd_data,所以出现x态。
