62 lines
1.1 KiB
Coq
62 lines
1.1 KiB
Coq
|
|
// `define READ read_good
|
||
|
|
|
||
|
|
module top;
|
||
|
|
reg clk;
|
||
|
|
reg dout;
|
||
|
|
reg [7:0] data;
|
||
|
|
integer lp;
|
||
|
|
|
||
|
|
always #10 clk = ~clk; // Build a clock generator.
|
||
|
|
|
||
|
|
always @(negedge clk) dout = ~dout; // Build a bit stream.
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
clk = 0;
|
||
|
|
dout = 0;
|
||
|
|
@(negedge clk);
|
||
|
|
for (lp=0; lp<4; lp=lp+1) begin
|
||
|
|
#0 read_bad(data);
|
||
|
|
$display("Read(%0d) %b from the bit stream.", lp, data);
|
||
|
|
#20; // For the fun of it skip a clock.
|
||
|
|
end
|
||
|
|
|
||
|
|
#1 $finish(0);
|
||
|
|
end
|
||
|
|
|
||
|
|
// This one locks up on the third call.
|
||
|
|
task read_bad;
|
||
|
|
output [7:0] edata;
|
||
|
|
|
||
|
|
integer i;
|
||
|
|
|
||
|
|
reg [7:0] rddata;
|
||
|
|
|
||
|
|
begin
|
||
|
|
for(i=7; i>=0; i=i-1) begin
|
||
|
|
@(posedge clk);
|
||
|
|
$display(" Reading bit %0d", i);
|
||
|
|
rddata[i] = dout; // <<--- This appears to be the problem line!
|
||
|
|
end
|
||
|
|
|
||
|
|
assign edata = rddata;
|
||
|
|
end
|
||
|
|
endtask
|
||
|
|
|
||
|
|
// This one works fine.
|
||
|
|
task read_good;
|
||
|
|
output [7:0] edata;
|
||
|
|
|
||
|
|
integer i;
|
||
|
|
|
||
|
|
reg [7:0] edata;
|
||
|
|
|
||
|
|
begin
|
||
|
|
for(i=7; i>=0; i=i-1) begin
|
||
|
|
@(posedge clk);
|
||
|
|
$display(" Reading bit %0d", i);
|
||
|
|
edata[i] = dout;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
endtask
|
||
|
|
endmodule
|