tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.module TopModule(
input clk,
input reset,
input in,
input [15:0] baud_div_i,
input [2:0] frame_fmt_i,
input clear_err_i,
input data_ack_i,
output reg [7:0] out_byte,
output reg done,
output reg parity_err_o,
output reg frame_err_o,
output reg break_o,
output reg ovf_o,
output reg [7:0] byte_count_o
);
// FSM states
localparam [2:0] IDLE = 3'd0,
START = 3'd1,
DATA = 3'd2,
PAR = 3'd3,
STOP = 3'd4;
reg [2:0] state;
reg [19:0] clk_cnt; // clocks within current bit
reg [3:0] data_idx; // data bit index
reg [1:0] stop_idx; // stop bit index
reg [7:0] rx_shift; // received data (LSB first)
reg par_acc; // running XOR of data bits
reg frame_bad; // frame has parity or framing error
reg in_d; // previous serial value (edge detect)
reg [15:0] baud_l; // latched baud
reg [2:0] fmt_l; // latched (normalized) format
reg [31:0] low_cnt; // consecutive-low counter for break
// ---- normalized live inputs ----
wire [2:0] fmt_norm = (frame_fmt_i > 3'b100) ? 3'b000 : frame_fmt_i;
wire [15:0] baud_norm = (baud_div_i == 16'd0) ? 16'd1 : baud_div_i;
wire [15:0] live_baud = (baud_div_i == 16'd0) ? 16'd1 : baud_div_i;
wire [31:0] brk_thresh = live_baud * 32'd176; // 11*16*baud
// ---- derived config from latched format ----
reg [3:0] ndata;
reg par_en;
reg par_odd;
reg [1:0] nstop;
always @* begin
case (fmt_l)
3'b000: begin ndata = 4'd8; par_en = 1'b0; par_odd = 1'b0; nstop = 2'd1; end
3'b001: begin ndata = 4'd7; par_en = 1'b0; par_odd = 1'b0; nstop = 2'd1; end
3'b010: begin ndata = 4'd8; par_en = 1'b1; par_odd = 1'b0; nstop = 2'd1; end
3'b011: begin ndata = 4'd8; par_en = 1'b1; par_odd = 1'b1; nstop = 2'd1; end
3'b100: begin ndata = 4'd8; par_en = 1'b0; par_odd = 1'b0; nstop = 2'd2; end
default:begin ndata = 4'd8; par_en = 1'b0; par_odd = 1'b0; nstop = 2'd1; end
endcase
end
// bit length and midpoint (16*baud, 8*baud)
wire [19:0] bit_len = {baud_l, 4'b0000};
wire [19:0] half = {1'b0, baud_l, 3'b000};
// per-cycle event flags (combinational temporaries)
reg ev_parity, ev_frame, ev_commit;
always @(posedge clk) begin
if (reset) begin
state <= IDLE;
clk_cnt <= 20'd0;
data_idx <= 4'd0;
stop_idx <= 2'd0;
rx_shift <= 8'd0;
par_acc <= 1'b0;
frame_bad <= 1'b0;
in_d <= 1'b1;
baud_l <= 16'd1;
fmt_l <= 3'b000;
low_cnt <= 32'd0;
out_byte <= 8'd0;
done <= 1'b0;
parity_err_o <= 1'b0;
frame_err_o <= 1'b0;
break_o <= 1'b0;
ovf_o <= 1'b0;
byte_count_o <= 8'd0;
end else begin
// default event flags
ev_parity = 1'b0;
ev_frame = 1'b0;
ev_commit = 1'b0;
in_d <= in;
// ---------------- break detection (live baud) ----------------
if (in) begin
low_cnt <= 32'd0;
break_o <= 1'b0;
end else begin
if (low_cnt != brk_thresh)
low_cnt <= low_cnt + 32'd1;
if (low_cnt + 32'd1 >= brk_thresh)
break_o <= 1'b1;
end
// ---------------- receive FSM ----------------
case (state)
IDLE: begin
if (in_d && !in) begin
baud_l <= baud_norm;
fmt_l <= fmt_norm;
clk_cnt <= 20'd0;
data_idx <= 4'd0;
stop_idx <= 2'd0;
rx_shift <= 8'd0;
par_acc <= 1'b0;
frame_bad <= 1'b0;
state <= START;
end
end
START: begin
if (clk_cnt == half) begin
if (in)
state <= IDLE; // high start midpoint: abort, no flags
end
if (clk_cnt == bit_len - 20'd1) begin
clk_cnt <= 20'd0;
data_idx <= 4'd0;
state <= DATA;
end else begin
clk_cnt <= clk_cnt + 20'd1;
end
end
DATA: begin
if (clk_cnt == half) begin
rx_shift[data_idx] <= in;
par_acc <= par_acc ^ in;
end
if (clk_cnt == bit_len - 20'd1) begin
clk_cnt <= 20'd0;
if (data_idx == ndata - 4'd1) begin
if (par_en) begin
state <= PAR;
end else begin
state <= STOP;
stop_idx <= 2'd0;
end
end else begin
data_idx <= data_idx + 4'd1;
end
end else begin
clk_cnt <= clk_cnt + 20'd1;
end
end
PAR: begin
if (clk_cnt == half) begin
if ((par_acc ^ in) != par_odd) begin
ev_parity = 1'b1;
frame_bad <= 1'b1;
end
end
if (clk_cnt == bit_len - 20'd1) begin
clk_cnt <= 20'd0;
stop_idx <= 2'd0;
state <= STOP;
end else begin
clk_cnt <= clk_cnt + 20'd1;
end
end
STOP: begin
if (clk_cnt == half) begin
if (!in) begin
ev_frame = 1'b1;
frame_bad <= 1'b1;
end
end
if (clk_cnt == bit_len - 20'd1) begin
clk_cnt <= 20'd0;
if (stop_idx == nstop - 2'd1) begin
if (!frame_bad)
ev_commit = 1'b1;
state <= IDLE;
end else begin
stop_idx <= stop_idx + 2'd1;
end
end else begin
clk_cnt <= clk_cnt + 20'd1;
end
end
default: state <= IDLE;
endcase
// ---------------- sticky error flags (set wins over clear) ----------------
if (ev_parity) parity_err_o <= 1'b1;
else if (clear_err_i) parity_err_o <= 1'b0;
if (ev_frame) frame_err_o <= 1'b1;
else if (clear_err_i) frame_err_o <= 1'b0;
// ---------------- commit / done / overflow / count ----------------
if (ev_commit) begin
out_byte <= rx_shift;
done <= 1'b1;
byte_count_o <= (byte_count_o == 8'hFF) ? 8'hFF : byte_count_o + 8'd1;
if (done && !data_ack_i) ovf_o <= 1'b1; // overflow (set wins)
else if (clear_err_i) ovf_o <= 1'b0;
end else begin
if (data_ack_i) done <= 1'b0;
if (clear_err_i) ovf_o <= 1'b0;
end
end
end
endmodule
Compile check with iverilog
(iverilog -g2012 -o /tmp/dut.out dut.sv 2>&1 && echo "COMPILE OK") || echo "iverilog not available or error"
COMPILE OK [stdout] COMPILE OK
Simulate a basic 8N1 frame
cat > /tmp/tb.sv <<'EOF'
module tb;
reg clk=0, reset=1, in=1, clear_err_i=0, data_ack_i=0;
reg [15:0] baud_div_i=1;
reg [2:0] frame_fmt_i=3'b000;
wire [7:0] out_byte, byte_count_o;
wire done, parity_err_o, frame_err_o, break_o, ovf_o;
TopModule d(clk,reset,in,baud_div_i,frame_fmt_i,clear_err_i,data_ack_i,
out_byte,done,parity_err_o,frame_err_o,break_o,ovf_o,byte_count_o);
always #5 clk=~clk;
integer i,b;
task send_bit(input v); begin in=v; repeat(16) @(posedge clk); end endtask
reg [7:0] data;
initial begin
repeat(3) @(posedge clk); reset=0; @(posedge clk);
data=8'h5A;
// start
send_bit(0);
for(i=0;i<8;i=i+1) send_bit(data[i]);
// 8N1 no parity, stop high
send_bit(1);
repeat(20) @(posedge clk);
$display("out_byte=%h done=%b count=%d ferr=%b perr=%b", out_byte, done, byte_count_o, frame_err_o, parity_err_o);
if(out_byte==8'h5A && done && byte_count_o==1) $display("PASS 8N1");
else $display("FAIL 8N1");
// ack clears done
data_ack_i=1; @(posedge clk); data_ack_i=0; @(posedge clk);
$display("after ack done=%b", done);
$finish;
end
endmodule
EOF
iverilog -g2012 -o /tmp/tb.out /tmp/dut_and_tb 2>/dev/null; iverilog -g2012 -o /tmp/tb.out dut.sv /tmp/tb.sv && vvp /tmp/tb.outout_byte=5a done=1 count= 1 ferr=0 perr=0 PASS 8N1 after ack done=1 /tmp/tb.sv:28: $finish called at 1855 (1s) [stdout] out_byte=5a done=1 count= 1 ferr=0 perr=0 PASS 8N1 after ack done=1 /tmp/tb.sv:28: $finish called at 1855 (1s)
Test ack and overflow behavior
cat > /tmp/tb2.sv <<'EOF'
module tb;
reg clk=0, reset=1, in=1, clear_err_i=0, data_ack_i=0;
reg [15:0] baud_div_i=1;
reg [2:0] frame_fmt_i=3'b000;
wire [7:0] out_byte, byte_count_o;
wire done, parity_err_o, frame_err_o, break_o, ovf_o;
TopModule d(clk,reset,in,baud_div_i,frame_fmt_i,clear_err_i,data_ack_i,
out_byte,done,parity_err_o,frame_err_o,break_o,ovf_o,byte_count_o);
always #5 clk=~clk;
integer i;
reg [7:0] data;
task send_bit(input v); begin in=v; repeat(16) @(posedge clk); end endtask
initial begin
repeat(3) @(posedge clk); reset=0; @(posedge clk);
data=8'h5A;
send_bit(0);
for(i=0;i<8;i=i+1) send_bit(data[i]);
send_bit(1);
repeat(5) @(posedge clk);
$display("done=%b", done);
@(negedge clk); data_ack_i=1;
@(negedge clk); data_ack_i=0;
@(negedge clk);
$display("after ack done=%b", done);
// overflow test: send two frames without ack
data=8'hA5;
send_bit(0); for(i=0;i<8;i=i+1) send_bit(data[i]); send_bit(1);
repeat(3)@(posedge clk);
$display("frame2 out=%h done=%b ovf=%b count=%d", out_byte, done, ovf_o, byte_count_o);
// do not ack, third frame -> should have already had done high from frame2? ack was done earlier so done was 0 before frame2. So no ovf yet.
// send third without ack
data=8'h3C;
send_bit(0); for(i=0;i<8;i=i+1) send_bit(data[i]); send_bit(1);
repeat(3)@(posedge clk);
$display("frame3 out=%h done=%b ovf=%b count=%d", out_byte, done, ovf_o, byte_count_o);
clear_err_i=1; @(negedge clk); clear_err_i=0; @(negedge clk);
$display("after clear ovf=%b", ovf_o);
$finish;
end
endmodule
EOF
iverilog -g2012 -o /tmp/tb2.out dut.sv /tmp/tb2.sv && vvp /tmp/tb2.outdone=1 after ack done=0 frame2 out=a5 done=1 ovf=0 count= 2 frame3 out=3c done=1 ovf=1 count= 3 after clear ovf=0 /tmp/tb2.sv:38: $finish called at 4980 (1s) [stdout] done=1 after ack done=0 frame2 out=a5 done=1 ovf=0 count= 2 frame3 out=3c done=1 ovf=1 count= 3 after clear ovf=0 /tmp/tb2.sv:38: $finish called at 4980 (1s)
Test parity, framing errors, abort, break
cat > /tmp/tb3.sv <<'EOF'
module tb;
reg clk=0, reset=1, in=1, clear_err_i=0, data_ack_i=0;
reg [15:0] baud_div_i=1;
reg [2:0] frame_fmt_i=3'b010; // 8E1
wire [7:0] out_byte, byte_count_o;
wire done, parity_err_o, frame_err_o, break_o, ovf_o;
TopModule d(clk,reset,in,baud_div_i,frame_fmt_i,clear_err_i,data_ack_i,
out_byte,done,parity_err_o,frame_err_o,break_o,ovf_o,byte_count_o);
always #5 clk=~clk;
integer i;
reg [7:0] data; reg par;
task send_bit(input v); begin in=v; repeat(16) @(posedge clk); end endtask
initial begin
repeat(3) @(posedge clk); reset=0; @(posedge clk);
// 8E1 good: data 8'hFF -> parity even = xor bits =0 -> parity bit 0
data=8'hFF; par=^data; // even parity bit = xor(data) to make total 0
send_bit(0); for(i=0;i<8;i=i+1) send_bit(data[i]); send_bit(par); send_bit(1);
repeat(3)@(posedge clk);
$display("8E1 good: out=%h done=%b perr=%b count=%d", out_byte,done,parity_err_o,byte_count_o);
// bad parity: send wrong parity bit
data=8'h0F; send_bit(0); for(i=0;i<8;i=i+1) send_bit(data[i]); send_bit(~(^data)); send_bit(1);
repeat(3)@(posedge clk);
$display("8E1 badpar: out=%h done=%b perr=%b count=%d (count should stay 1)", out_byte,done,parity_err_o,byte_count_o);
clear_err_i=1;@(negedge clk);clear_err_i=0;@(negedge clk);
$display("after clear perr=%b", parity_err_o);
// framing error 8N1: stop low
frame_fmt_i=3'b000;
data=8'h55; send_bit(0); for(i=0;i<8;i=i+1) send_bit(data[i]); send_bit(0); // low stop
send_bit(1); repeat(3)@(posedge clk);
$display("frame err: ferr=%b count=%d (count still 1)", frame_err_o, byte_count_o);
clear_err_i=1;@(negedge clk);clear_err_i=0;
// abort: falling edge then high at midpoint
in=0; repeat(4)@(posedge clk); in=1; repeat(20)@(posedge clk);
$display("abort: perr=%b ferr=%b done unchanged", parity_err_o, frame_err_o);
// break: hold low for > 11*16 = 176 cycles
in=0; repeat(180)@(posedge clk);
$display("break asserted=%b", break_o);
in=1; @(posedge clk); @(posedge clk);
$display("break after high=%b", break_o);
$finish;
end
endmodule
EOF
iverilog -g2012 -o /tmp/tb3.out dut.sv /tmp/tb3.sv && vvp /tmp/tb3.out8E1 good: out=ff done=1 perr=0 count= 1 8E1 badpar: out=ff done=1 perr=1 count= 1 (count should stay 1) after clear perr=0 frame err: ferr=1 count= 1 (count still 1) abort: perr=0 ferr=0 done unchanged break asserted=1 break after high=0 /tmp/tb3.sv:40: $finish called at 7475 (1s) [stdout] 8E1 good: out=ff done=1 perr=0 count= 1 8E1 badpar: out=ff done=1 perr=1 count= 1 (count should stay 1) after clear perr=0 frame err: ferr=1 count= 1 (count still 1) abort: perr=0 ferr=0 done unchanged break asserted=1 break after high=0 /tmp/tb3.sv:40: $finish called at 7475 (1s)
No file changes, the agent left the workspace untouched.
TEST dut_present: PASS (/app/dut.sv exists) TEST dut_forbidden: PASS (no forbidden constructs) TEST harness_prepare: PASS (harness names nonce-renamed) TEST dut_compiles: PASS (compiled with held-back reference/testbench) TEST simulation_completed: PASS (Mismatches: 10 in 155243 samples) TEST reference_equivalence: FAIL (10 mismatches in 155243 samples)
Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_557adaa1d351412c. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_557adaa1d351412c · verifier authoritative; classifier explanatory.