tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.module TopModule (
input logic clk,
input logic rst,
input logic [3:0] req,
input logic lock,
output logic [3:0] grant,
output logic grant_valid
);
// Registered state
logic [1:0] ptr; // scan starts here (just past last winner)
logic hold_active; // a locked winner is being held
logic [1:0] hold_who; // which requester is held
// Next-state
logic [1:0] next_ptr;
logic next_hold_active;
logic [1:0] next_hold_who;
// Combinational outputs (pre reset-gate)
logic [3:0] grant_c;
logic grant_valid_c;
// Scan results
logic found;
logic [1:0] win;
logic [1:0] idx;
always_comb begin
// circular scan from ptr: first asker wins
found = 1'b0;
win = 2'b00;
for (int i = 0; i < 4; i++) begin
idx = ptr + i[1:0]; // 2-bit add wraps mod 4
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end
// defaults: hold place
grant_c = 4'b0000;
grant_valid_c = 1'b0;
next_ptr = ptr;
next_hold_active = hold_active;
next_hold_who = hold_who;
if (hold_active) begin
if (req[hold_who]) begin
// held winner still asks -> owns this cycle
grant_c = (4'b0001 << hold_who);
grant_valid_c = 1'b1;
if (lock) begin
// hold persists while lock stays high
next_hold_active = 1'b1;
end else begin
// lock dropped: this cycle owned, resume next cycle just past it
next_hold_active = 1'b0;
next_ptr = hold_who + 2'd1;
end
end else begin
// held req low: dead air, hold over, counts as served
grant_c = 4'b0000;
grant_valid_c = 1'b0;
next_hold_active = 1'b0;
next_ptr = hold_who + 2'd1;
end
end else begin
if (found) begin
grant_c = (4'b0001 << win);
grant_valid_c = 1'b1;
next_ptr = win + 2'd1;
if (lock) begin
// latch this winner (granted cycle + lock)
next_hold_active = 1'b1;
next_hold_who = win;
end else begin
next_hold_active = 1'b0;
end
end
// else: idle, keep place (defaults)
end
end
always_ff @(posedge clk) begin
if (rst) begin
ptr <= 2'd0; // requester 0 wins the first shared cycle
hold_active <= 1'b0; // clears any hold
hold_who <= 2'd0;
end else begin
ptr <= next_ptr;
hold_active <= next_hold_active;
hold_who <= next_hold_who;
end
end
assign grant = rst ? 4'b0000 : grant_c;
assign grant_valid = rst ? 1'b0 : grant_valid_c;
endmodule
cat > tb_smoke.sv <<'EOF'
module tb;
logic clk=0, rst, lock;
logic [3:0] req;
logic [3:0] grant;
logic grant_valid;
TopModule dut(.clk,.rst,.req,.lock,.grant,.grant_valid);
always #5 clk=~clk;
task step; @(posedge clk); #1; endtask
initial begin
rst=1; req=4'b0000; lock=0; step; step;
rst=0;
// all four ask forever, no lock -> 0,1,2,3,0
req=4'b1111;
repeat(6) begin $display("grant=%b gv=%b",grant,grant_valid); step; end
// lone requester keeps winning
req=4'b0100;
repeat(3) begin $display("lone grant=%b gv=%b",grant,grant_valid); step; end
// idle keeps place
req=4'b0000; step; $display("idle gv=%b",grant_valid);
req=4'b1111; $display("resume grant=%b",grant); step;
// lock hold test: grant winner then lock high
rst=1; step; rst=0;
req=4'b0010; lock=1; $display("hold t0 grant=%b",grant); step;
$display("hold t1 grant=%b (others high)",grant); req=4'b1111; step;
$display("hold t2 grant=%b",grant); step;
lock=0; $display("drop grant=%b",grant); step;
$display("after drop grant=%b",grant); step;
// dead air: lock high, held req drops
rst=1; step; rst=0; req=4'b0001; lock=1; step; // latch 0
req=4'b0100; $display("dead grant=%b gv=%b",grant,grant_valid); step;
$display("resume grant=%b",grant);
$finish;
end
endmodule
EOF
iverilog -g2012 -o sim dut.sv tb_smoke.sv && vvp simdut.sv:29: sorry: constant selects in always_* processes are not currently supported (all bits will be included). grant=0000 gv=0 grant=0010 gv=1 grant=0100 gv=1 grant=1000 gv=1 grant=0001 gv=1 grant=0010 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 idle gv=0 resume grant=0000 hold t0 grant=0000 hold t1 grant=0010 (others high) hold t2 grant=0010 drop grant=0010 after drop grant=0100 dead grant=0001 gv=1 resume grant=0100 tb_smoke.sv:32: $finish called at 216 (1s) [stdout] dut.sv:29: sorry: constant selects in always_* processes are not currently supported (all bits will be included). grant=0000 gv=0 grant=0010 gv=1 grant=0100 gv=1 grant=1000 gv=1 grant=0001 gv=1 grant=0010 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 idle gv=0 resume grant=0000 hold t0 grant=0000 hold t1 grant=0010 (others high) hold t2 grant=0010 drop grant=0010 after drop grant=0100 dead grant=0001 gv=1 resume grant=0100 tb_smoke.sv:32: $finish called at 216 (1s)
/app/dut.sv
for (int i = 0; i < 4; i++) begin
idx = ptr + i[1:0]; // 2-bit add wraps mod 4 for (int i = 0; i < 4; i++) begin
idx = ptr + i[2:0]; // 2-bit idx truncation wraps mod 4/app/dut.sv
for (int i = 0; i < 4; i++) begin
idx = ptr + i[2:0]; // 2-bit idx truncation wraps mod 4 for (int i = 0; i < 4; i++) begin
idx = ptr + i[1:0]; // 2-bit idx truncation wraps mod 4/app/dut.sv
found = 1'b0;
win = 2'b00;
for (int i = 0; i < 4; i++) begin
idx = ptr + i[1:0]; // 2-bit idx truncation wraps mod 4
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end found = 1'b0;
win = 2'b00;
for (int i = 0; i < 4; i = i + 1) begin
idx = ptr + off[i]; // 2-bit idx truncation wraps mod 4
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end/app/dut.sv
found = 1'b0;
win = 2'b00;
for (int i = 0; i < 4; i = i + 1) begin
idx = ptr + off[i]; // 2-bit idx truncation wraps mod 4
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end found = 1'b0;
win = 2'b00;
for (int i = 0; i < 4; i = i + 1) begin
i2 = i[1:0]; // truncate loop var to 2 bits
idx = ptr + i2; // 2-bit add wraps mod 4
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end/app/dut.sv
i2 = i[1:0]; // truncate loop var to 2 bits
idx = ptr + i2; // 2-bit add wraps mod 4 i2 = i; // truncate loop var to 2 bits
idx = ptr + i2; // 2-bit add wraps mod 4/app/dut.sv
logic [1:0] win;
logic [1:0] idx; logic [1:0] win;
logic [1:0] idx;
logic [1:0] i2;iverilog -g2012 -o sim dut.sv tb_smoke.sv && vvp sim
grant=0000 gv=0 grant=0010 gv=1 grant=0100 gv=1 grant=1000 gv=1 grant=0001 gv=1 grant=0010 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 idle gv=0 resume grant=0000 hold t0 grant=0000 hold t1 grant=0010 (others high) hold t2 grant=0010 drop grant=0010 after drop grant=0100 dead grant=0001 gv=1 resume grant=0100 tb_smoke.sv:32: $finish called at 216 (1s) [stdout] grant=0000 gv=0 grant=0010 gv=1 grant=0100 gv=1 grant=1000 gv=1 grant=0001 gv=1 grant=0010 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 lone grant=0100 gv=1 idle gv=0 resume grant=0000 hold t0 grant=0000 hold t1 grant=0010 (others high) hold t2 grant=0010 drop grant=0010 after drop grant=0100 dead grant=0001 gv=1 resume grant=0100 tb_smoke.sv:32: $finish called at 216 (1s)
cat > tb2.sv <<'EOF'
module tb;
logic clk=0, rst, lock; logic [3:0] req, grant; logic grant_valid;
TopModule dut(.clk,.rst,.req,.lock,.grant,.grant_valid);
always #5 clk=~clk;
int errors=0;
// drive inputs just after negedge, sample just before posedge
task drive(input [3:0] r, input l, input rs); @(negedge clk); req=r; lock=l; rst=rs; endtask
task chk(input [3:0] eg, input egv, input [127:0] tag);
@(posedge clk); #0;
if (grant!==eg || grant_valid!==egv) begin
$display("FAIL %0s: grant=%b gv=%b exp %b %b",tag,grant,grant_valid,eg,egv); errors++;
end else $display("ok %0s: grant=%b gv=%b",tag,grant,grant_valid);
endtask
initial begin
// reset
drive(4'b0000,0,1); chk(4'b0000,0,"rst");
// round robin 0,1,2,3,0
drive(4'b1111,0,0); chk(4'b0001,1,"rr0");
drive(4'b1111,0,0); chk(4'b0010,1,"rr1");
drive(4'b1111,0,0); chk(4'b0100,1,"rr2");
drive(4'b1111,0,0); chk(4'b1000,1,"rr3");
drive(4'b1111,0,0); chk(4'b0001,1,"rr0b");
// lone winner 2
drive(4'b0100,0,0); chk(4'b0100,1,"lone");
drive(4'b0100,0,0); chk(4'b0100,1,"lone2");
// idle keeps place (last winner was 2 -> ptr=3)
drive(4'b0000,0,0); chk(4'b0000,0,"idle");
// resume: scan from 3: only req0 -> after 3 comes 0
drive(4'b0001,0,0); chk(4'b0001,1,"resume0");
// lock hold on 1
drive(4'b1111,0,1); chk(4'b0010,1,"lk_start1"); // ptr was 1 (past 0)
drive(4'b1111,0,1); chk(4'b0010,1,"lk_hold"); // others high, locked to 1
drive(4'b1101,0,1); chk(4'b0010,1,"lk_req1_low_others"); // req1 still high
drive(4'b1111,0,0); chk(4'b0010,1,"lk_drop_owns"); // lock drops, still owns
drive(4'b1111,0,0); chk(4'b0100,1,"resume_past1"); // resume just past 1 -> 2
// dead air: latch 0 with lock, then req0 low while lock high
drive(4'b0001,0,0); // clear to known: winner0, ptr->1
@(posedge clk);
drive(4'b0010,0,1); // scan from 2? ptr after 0 =1 -> winner1 latched
@(posedge clk);
drive(4'b0000,0,1); chk(4'b0000,0,"deadair"); // held(1) req low -> dead
drive(4'b0100,0,0); chk(4'b0100,1,"resume_past_dead"); // past dead 1 ->2
$display("errors=%0d",errors); $finish;
end
endmodule
EOF
iverilog -g2012 -o sim2 dut.sv tb2.sv && vvp sim2ok rst: grant=0000 gv=0 ok rr0: grant=0001 gv=1 ok rr1: grant=0010 gv=1 ok rr2: grant=0100 gv=1 ok rr3: grant=1000 gv=1 ok rr0b: grant=0001 gv=1 ok lone: grant=0100 gv=1 ok lone2: grant=0100 gv=1 ok idle: grant=0000 gv=0 ok resume0: grant=0001 gv=1 FAIL lk_start1: grant=0000 gv=0 exp 0010 1 FAIL lk_hold: grant=0000 gv=0 exp 0010 1 FAIL _req1_low_others: grant=0000 gv=0 exp 0010 1 FAIL lk_drop_owns: grant=0001 gv=1 exp 0010 1 FAIL resume_past1: grant=0010 gv=1 exp 0100 1 ok deadair: grant=0000 gv=0 ok resume_past_dead: grant=0100 gv=1 errors=5 tb2.sv:43: $finish called at 195 (1s) [stdout] ok rst: grant=0000 gv=0 ok rr0: grant=0001 gv=1 ok rr1: grant=0010 gv=1 ok rr2: grant=0100 gv=1 ok rr3: grant=1000 gv=1 ok rr0b: grant=0001 gv=1 ok lone: grant=0100 gv=1 ok lone2: grant=0100 gv=1 ok idle: grant=0000 gv=0 ok resume0: grant=0001 gv=1 FAIL lk_start1: grant=0000 gv=0 exp 0010 1 FAIL lk_hold: grant=0000 gv=0 exp 0010 1 FAIL _req1_low_others: grant=0000 gv=0 exp 0010 1 FAIL lk_drop_owns: grant=0001 gv=1 exp 0010 1 FAIL resume_past1: grant=0010 gv=1 exp 0100 1 ok deadair: grant=0000 gv=0 ok resume_past_dead: grant=0100 gv=1 errors=5 tb2.sv:43: $finish called at 195 (1s)
cat > tb3.sv <<'EOF'
module tb;
logic clk=0, rst, lock; logic [3:0] req, grant; logic grant_valid;
TopModule dut(.clk,.rst,.req,.lock,.grant,.grant_valid);
always #5 clk=~clk;
int errors=0;
task drive(input [3:0] r, input l, input rs); @(negedge clk); req=r; lock=l; rst=rs; endtask
task chk(input [3:0] eg, input egv, input [199:0] tag);
@(posedge clk); #0;
if (grant!==eg || grant_valid!==egv) begin
$display("FAIL %0s: grant=%b gv=%b exp %b %b",tag,grant,grant_valid,eg,egv); errors++;
end else $display("ok %0s: grant=%b gv=%b",tag,grant,grant_valid);
endtask
initial begin
drive(4'b0000,0,1); chk(4'b0000,0,"rst");
drive(4'b1111,0,0); chk(4'b0001,1,"rr0"); // ptr->1
// lock hold on 1
drive(4'b1111,1,0); chk(4'b0010,1,"lk_start1"); // win1, latch (lock)
drive(4'b1111,1,0); chk(4'b0010,1,"lk_hold"); // locked to 1
drive(4'b1101,1,0); chk(4'b0010,1,"lk_others_low"); // req1 high, held
drive(4'b1111,0,0); chk(4'b0010,1,"lk_drop_owns"); // lock drops, still owns; ptr->2
drive(4'b1111,0,0); chk(4'b0100,1,"resume_past1"); // resume just past 1 -> 2; ptr->3
// dead air with lock still high
drive(4'b1000,1,0); chk(4'b1000,1,"latch3"); // scan from3: win3, latch (lock)
drive(4'b0100,1,0); chk(4'b0000,0,"deadair"); // held3 req low -> dead air; ptr->0
drive(4'b0100,1,0); chk(4'b0100,1,"reLatch2"); // lock still high, latch next winner 2 (from ptr0: req2)
drive(4'b0000,1,0); chk(4'b0000,0,"dead_again"); // held2 req low -> dead; ptr->3
drive(4'b1111,0,0); chk(4'b1000,1,"resume_past2"); // resume from3 -> win3
// reset clears hold mid-lock
drive(4'b0001,1,0); chk(4'b0001,1,"latch0b"); // ptr was 0 (past3): win0 latch
drive(4'b0001,1,1); chk(4'b0000,0,"rst_clears"); // rst gates + clears hold, ptr->0
drive(4'b1111,0,0); chk(4'b0001,1,"after_rst_0wins"); // order restarted: 0 wins
// lock with no grant does nothing
drive(4'b0000,1,0); chk(4'b0000,0,"lock_no_grant");
drive(4'b1111,0,0); chk(4'b0010,1,"noHoldFromEmpty"); // ptr->1 (past0 from after_rst); no latch happened
$display("errors=%0d",errors); $finish;
end
endmodule
EOF
iverilog -g2012 -o sim3 dut.sv tb3.sv && vvp sim3ok rst: grant=0000 gv=0 ok rr0: grant=0001 gv=1 ok lk_start1: grant=0010 gv=1 ok lk_hold: grant=0010 gv=1 FAIL lk_others_low: grant=0000 gv=0 exp 0010 1 FAIL lk_drop_owns: grant=0100 gv=1 exp 0010 1 FAIL resume_past1: grant=1000 gv=1 exp 0100 1 ok latch3: grant=1000 gv=1 ok deadair: grant=0000 gv=0 ok reLatch2: grant=0100 gv=1 ok dead_again: grant=0000 gv=0 ok resume_past2: grant=1000 gv=1 ok latch0b: grant=0001 gv=1 ok rst_clears: grant=0000 gv=0 ok after_rst_0wins: grant=0001 gv=1 ok lock_no_grant: grant=0000 gv=0 ok noHoldFromEmpty: grant=0010 gv=1 errors=3 tb3.sv:35: $finish called at 175 (1s) [stdout] ok rst: grant=0000 gv=0 ok rr0: grant=0001 gv=1 ok lk_start1: grant=0010 gv=1 ok lk_hold: grant=0010 gv=1 FAIL lk_others_low: grant=0000 gv=0 exp 0010 1 FAIL lk_drop_owns: grant=0100 gv=1 exp 0010 1 FAIL resume_past1: grant=1000 gv=1 exp 0100 1 ok latch3: grant=1000 gv=1 ok deadair: grant=0000 gv=0 ok reLatch2: grant=0100 gv=1 ok dead_again: grant=0000 gv=0 ok resume_past2: grant=1000 gv=1 ok latch0b: grant=0001 gv=1 ok rst_clears: grant=0000 gv=0 ok after_rst_0wins: grant=0001 gv=1 ok lock_no_grant: grant=0000 gv=0 ok noHoldFromEmpty: grant=0010 gv=1 errors=3 tb3.sv:35: $finish called at 175 (1s)
sed -i 's|drive(4.b1101,1,0); chk(4.b0010,1,"lk_others_low");.*|drive(4'"'"'b0010,1,0); chk(4'"'"'b0010,1,"lk_others_low");|' tb3.sv iverilog -g2012 -o sim3 dut.sv tb3.sv && vvp sim3 | grep -E "FAIL|errors"
errors=0 [stdout] errors=0
iverilog -g2012 -o /dev/null dut.sv && echo "iverilog -g2012: clean compile" grep -nE "\$|force|release|\`" dut.sv | grep -v "grant\$\|valid\$" || echo "no system tasks / preprocessor / force-release" LC_ALL=C grep -nP '[^\x00-\x7F]' dut.sv && echo "NON-ASCII FOUND" || echo "ascii-only OK"
iverilog -g2012: clean compile no system tasks / preprocessor / force-release ascii-only OK [stdout] iverilog -g2012: clean compile no system tasks / preprocessor / force-release ascii-only OK
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 dut_elaborates: PASS (DUT elaborates standalone)
TEST dut_compiles: PASS (compiled with held-back reference/testbench)
TEST simulation_completed: PASS (Mismatches: 0 in 4583 samples)
TEST reference_equivalence: PASS (all 4583 samples matched reference)
{"score": 1.000000, "results_file": "/tmp/h2t-grader-home.HjNBHH/runtime/cb_verifier_349-2969-5541-19315_349/results.jsonl"}Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_2b93dc7346a24a91. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_2b93dc7346a24a91 · verifier authoritative; classifier explanatory.