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
);
// ptr : next round-robin scan start position
// hold : currently latched onto a winner
// hidx : the held winner's index
logic [1:0] ptr;
logic hold;
logic [1:0] hidx;
logic [1:0] next_ptr;
logic next_hold;
logic [1:0] next_hidx;
// round-robin scan result
logic found;
logic [1:0] win;
integer i;
logic [1:0] idx;
always_comb begin
// scan up from ptr, wrapping, first asker wins
found = 1'b0;
win = 2'b00;
for (i = 0; i < 4; i = i + 1) begin
idx = ptr + i[1:0];
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end
// defaults
grant = 4'b0000;
grant_valid = 1'b0;
next_ptr = ptr;
next_hold = hold;
next_hidx = hidx;
if (hold) begin
// A hold lives only while the held requester keeps asking.
if (req[hidx]) begin
grant = (4'b0001 << hidx);
grant_valid = 1'b1;
if (lock) begin
// keep holding
next_hold = 1'b1;
next_hidx = hidx;
next_ptr = hidx + 2'd1;
end else begin
// lock dropped: held winner still owns this cycle,
// sharing resumes next cycle just past it
next_hold = 1'b0;
next_ptr = hidx + 2'd1;
end
end else begin
// held req low -> dead air regardless of lock;
// counts as served, sharing resumes just past it
grant = 4'b0000;
grant_valid = 1'b0;
next_hold = 1'b0;
next_ptr = hidx + 2'd1;
end
end else begin
if (found) begin
grant = (4'b0001 << win);
grant_valid = 1'b1;
next_ptr = win + 2'd1;
if (lock) begin
// latch this winner
next_hold = 1'b1;
next_hidx = win;
end else begin
next_hold = 1'b0;
end
end else begin
// no asker: idle keeps your place; lock with no grant does nothing
grant = 4'b0000;
grant_valid = 1'b0;
end
end
end
always_ff @(posedge clk) begin
if (rst) begin
// synchronous clear: restart order (scan starts at 0), drop hold
ptr <= 2'd0;
hold <= 1'b0;
hidx <= 2'd0;
end else begin
ptr <= next_ptr;
hold <= next_hold;
hidx <= next_hidx;
end
end
endmodule
cat > tb.sv <<'EOF'
module tb;
logic clk, rst, lock;
logic [3:0] req, grant;
logic grant_valid;
TopModule dut(.*);
initial begin clk=0; forever #5 clk=~clk; end
task step; @(posedge clk); #1; $display("t=%0t req=%b lock=%b grant=%b gv=%b",$time,req,lock,grant,grant_valid); endtask
initial begin
rst=1; req=0; lock=0; @(posedge clk); #1; rst=0;
$display("-- all four, no lock: expect 0,1,2,3,0");
req=4'b1111; lock=0;
step;step;step;step;step;
$display("-- lock winner 0 (all ask, lock high): expect grant stays 0");
req=4'b1111; lock=1; step; step; step;
$display("-- lock drops, req0 still high: owns this cycle then resume at 1");
lock=0; step; step;
$display("-- dead air test: lock winner then held req low");
rst=1; step; rst=0; req=4'b1111; lock=1; step; step;
$display("now drop req of held winner (whichever). set req to exclude idx served");
req=4'b1110; step; // if held 0, dead air; grant0 gv0
lock=0; req=4'b1111; step; step;
$finish;
end
endmodule
EOF
iverilog -g2012 -o sim dut.sv tb.sv && vvp simdut.sv:26: sorry: constant selects in always_* processes are not currently supported (all bits will be included). -- all four, no lock: expect 0,1,2,3,0 t=16 req=1111 lock=0 grant=0010 gv=1 t=26 req=1111 lock=0 grant=0100 gv=1 t=36 req=1111 lock=0 grant=1000 gv=1 t=46 req=1111 lock=0 grant=0001 gv=1 t=56 req=1111 lock=0 grant=0010 gv=1 -- lock winner 0 (all ask, lock high): expect grant stays 0 t=66 req=1111 lock=1 grant=0010 gv=1 t=76 req=1111 lock=1 grant=0010 gv=1 t=86 req=1111 lock=1 grant=0010 gv=1 -- lock drops, req0 still high: owns this cycle then resume at 1 t=96 req=1111 lock=0 grant=0100 gv=1 t=106 req=1111 lock=0 grant=1000 gv=1 -- dead air test: lock winner then held req low t=116 req=1111 lock=0 grant=0001 gv=1 t=126 req=1111 lock=1 grant=0001 gv=1 t=136 req=1111 lock=1 grant=0001 gv=1 now drop req of held winner (whichever). set req to exclude idx served t=146 req=1110 lock=1 grant=0010 gv=1 t=156 req=1111 lock=0 grant=0100 gv=1 t=166 req=1111 lock=0 grant=1000 gv=1 tb.sv:22: $finish called at 166 (1s) [stdout] dut.sv:26: sorry: constant selects in always_* processes are not currently supported (all bits will be included). -- all four, no lock: expect 0,1,2,3,0 t=16 req=1111 lock=0 grant=0010 gv=1 t=26 req=1111 lock=0 grant=0100 gv=1 t=36 req=1111 lock=0 grant=1000 gv=1 t=46 req=1111 lock=0 grant=0001 gv=1 t=56 req=1111 lock=0 grant=0010 gv=1 -- lock winner 0 (all ask, lock high): expect grant stays 0 t=66 req=1111 lock=1 grant=0010 gv=1 t=76 req=1111 lock=1 grant=0010 gv=1 t=86 req=1111 lock=1 grant=0010 gv=1 -- lock drops, req0 still high: owns this cycle then resume at 1 t=96 req=1111 lock=0 grant=0100 gv=1 t=106 req=1111 lock=0 grant=1000 gv=1 -- dead air test: lock winner then held req low t=116 req=1111 lock=0 grant=0001 gv=1 t=126 req=1111 lock=1 grant=0001 gv=1 t=136 req=1111 lock=1 grant=0001 gv=1 now drop req of held winner (whichever). set req to exclude idx served t=146 req=1110 lock=1 grant=0010 gv=1 t=156 req=1111 lock=0 grant=0100 gv=1 t=166 req=1111 lock=0 grant=1000 gv=1 tb.sv:22: $finish called at 166 (1s)
/app/dut.sv
// round-robin scan result
logic found;
logic [1:0] win;
integer i;
logic [1:0] idx;
always_comb begin
// scan up from ptr, wrapping, first asker wins
found = 1'b0;
win = 2'b00;
for (i = 0; i < 4; i = i + 1) begin
idx = ptr + i[1:0];
if (!found && req[idx]) begin
found = 1'b1;
win = idx;
end
end // round-robin scan result
logic found;
logic [1:0] win;
logic [1:0] c0, c1, c2, c3;
always_comb begin
// scan up from ptr, wrapping, first asker wins
c0 = ptr;
c1 = ptr + 2'd1;
c2 = ptr + 2'd2;
c3 = ptr + 2'd3;
found = 1'b0;
win = 2'b00;
if (req[c0]) begin
found = 1'b1; win = c0;
end else if (req[c1]) begin
found = 1'b1; win = c1;
end else if (req[c2]) begin
found = 1'b1; win = c2;
end else if (req[c3]) begin
found = 1'b1; win = c3;
endiverilog -g2012 -o sim dut.sv tb.sv && vvp sim
-- all four, no lock: expect 0,1,2,3,0 t=16 req=1111 lock=0 grant=0010 gv=1 t=26 req=1111 lock=0 grant=0100 gv=1 t=36 req=1111 lock=0 grant=1000 gv=1 t=46 req=1111 lock=0 grant=0001 gv=1 t=56 req=1111 lock=0 grant=0010 gv=1 -- lock winner 0 (all ask, lock high): expect grant stays 0 t=66 req=1111 lock=1 grant=0010 gv=1 t=76 req=1111 lock=1 grant=0010 gv=1 t=86 req=1111 lock=1 grant=0010 gv=1 -- lock drops, req0 still high: owns this cycle then resume at 1 t=96 req=1111 lock=0 grant=0100 gv=1 t=106 req=1111 lock=0 grant=1000 gv=1 -- dead air test: lock winner then held req low t=116 req=1111 lock=0 grant=0001 gv=1 t=126 req=1111 lock=1 grant=0001 gv=1 t=136 req=1111 lock=1 grant=0001 gv=1 now drop req of held winner (whichever). set req to exclude idx served t=146 req=1110 lock=1 grant=0010 gv=1 t=156 req=1111 lock=0 grant=0100 gv=1 t=166 req=1111 lock=0 grant=1000 gv=1 tb.sv:22: $finish called at 166 (1s) [stdout] -- all four, no lock: expect 0,1,2,3,0 t=16 req=1111 lock=0 grant=0010 gv=1 t=26 req=1111 lock=0 grant=0100 gv=1 t=36 req=1111 lock=0 grant=1000 gv=1 t=46 req=1111 lock=0 grant=0001 gv=1 t=56 req=1111 lock=0 grant=0010 gv=1 -- lock winner 0 (all ask, lock high): expect grant stays 0 t=66 req=1111 lock=1 grant=0010 gv=1 t=76 req=1111 lock=1 grant=0010 gv=1 t=86 req=1111 lock=1 grant=0010 gv=1 -- lock drops, req0 still high: owns this cycle then resume at 1 t=96 req=1111 lock=0 grant=0100 gv=1 t=106 req=1111 lock=0 grant=1000 gv=1 -- dead air test: lock winner then held req low t=116 req=1111 lock=0 grant=0001 gv=1 t=126 req=1111 lock=1 grant=0001 gv=1 t=136 req=1111 lock=1 grant=0001 gv=1 now drop req of held winner (whichever). set req to exclude idx served t=146 req=1110 lock=1 grant=0010 gv=1 t=156 req=1111 lock=0 grant=0100 gv=1 t=166 req=1111 lock=0 grant=1000 gv=1 tb.sv:22: $finish called at 166 (1s)
cat > tb.sv <<'EOF'
module tb;
logic clk, rst, lock;
logic [3:0] req, grant;
logic grant_valid;
TopModule dut(.*);
initial begin clk=0; forever #5 clk=~clk; end
// drive on posedge region, sample on negedge (stable, current cycle)
task cyc(input [3:0] r, input l, input string note);
req=r; lock=l; @(negedge clk);
$display("req=%b lock=%b -> grant=%b gv=%b %s",req,lock,grant,grant_valid,note);
@(posedge clk);
endtask
initial begin
rst=1; req=0; lock=0; @(negedge clk); @(posedge clk); rst=0;
$display("-- all four, no lock: expect 0,1,2,3,0,1");
cyc(4'b1111,0,"exp 0001");
cyc(4'b1111,0,"exp 0010");
cyc(4'b1111,0,"exp 0100");
cyc(4'b1111,0,"exp 1000");
cyc(4'b1111,0,"exp 0001");
cyc(4'b1111,0,"exp 0010");
$display("-- lone requester (only 2): keeps winning");
cyc(4'b0100,0,"exp 0100");
cyc(4'b0100,0,"exp 0100");
$display("-- idle keeps place, then req all: resume just past 2 -> 3");
cyc(4'b0000,0,"exp 0000 gv0");
cyc(4'b1111,0,"exp 1000 (idx3)");
$display("-- reset, lock winner0");
rst=1; @(negedge clk); @(posedge clk); rst=0;
cyc(4'b1111,1,"exp 0001 latch");
cyc(4'b1111,1,"exp 0001 held");
cyc(4'b1111,1,"exp 0001 held");
$display("-- lock drops, held req high: owns cycle, then resume at 1");
cyc(4'b1111,0,"exp 0001 (last owned)");
cyc(4'b1111,0,"exp 0010 (idx1)");
$display("-- reset, lock winner0 then dead air (req0 low)");
rst=1; @(negedge clk); @(posedge clk); rst=0;
cyc(4'b1111,1,"exp 0001 latch");
cyc(4'b1110,1,"exp 0000 gv0 dead air (lock still high)");
cyc(4'b1111,1,"exp 0010 relatch idx1 (resume past dead 0)");
cyc(4'b1111,1,"exp 0010 held");
$display("-- lock high but no grant: does nothing");
rst=1; @(negedge clk); @(posedge clk); rst=0;
cyc(4'b0000,1,"exp 0000 gv0");
cyc(4'b1111,0,"exp 0001 (place kept at 0)");
$finish;
end
endmodule
EOF
iverilog -g2012 -o sim dut.sv tb.sv && vvp sim-- all four, no lock: expect 0,1,2,3,0,1 req=1111 lock=0 -> grant=0001 gv=1 exp 0001 req=1111 lock=0 -> grant=0010 gv=1 exp 0010 req=1111 lock=0 -> grant=0100 gv=1 exp 0100 req=1111 lock=0 -> grant=1000 gv=1 exp 1000 req=1111 lock=0 -> grant=0001 gv=1 exp 0001 req=1111 lock=0 -> grant=0010 gv=1 exp 0010 -- lone requester (only 2): keeps winning req=0100 lock=0 -> grant=0100 gv=1 exp 0100 req=0100 lock=0 -> grant=0100 gv=1 exp 0100 -- idle keeps place, then req all: resume just past 2 -> 3 req=0000 lock=0 -> grant=0000 gv=0 exp 0000 gv0 req=1111 lock=0 -> grant=1000 gv=1 exp 1000 (idx3) -- reset, lock winner0 req=1111 lock=1 -> grant=0010 gv=1 exp 0001 latch req=1111 lock=1 -> grant=0010 gv=1 exp 0001 held req=1111 lock=1 -> grant=0010 gv=1 exp 0001 held -- lock drops, held req high: owns cycle, then resume at 1 req=1111 lock=0 -> grant=0010 gv=1 exp 0001 (last owned) req=1111 lock=0 -> grant=0100 gv=1 exp 0010 (idx1) -- reset, lock winner0 then dead air (req0 low) req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch req=1110 lock=1 -> grant=0000 gv=0 exp 0000 gv0 dead air (lock still high) req=1111 lock=1 -> grant=0010 gv=1 exp 0010 relatch idx1 (resume past dead 0) req=1111 lock=1 -> grant=0010 gv=1 exp 0010 held -- lock high but no grant: does nothing req=0000 lock=1 -> grant=0000 gv=0 exp 0000 gv0 req=1111 lock=0 -> grant=0100 gv=1 exp 0001 (place kept at 0) tb.sv:46: $finish called at 255 (1s) [stdout] -- all four, no lock: expect 0,1,2,3,0,1 req=1111 lock=0 -> grant=0001 gv=1 exp 0001 req=1111 lock=0 -> grant=0010 gv=1 exp 0010 req=1111 lock=0 -> grant=0100 gv=1 exp 0100 req=1111 lock=0 -> grant=1000 gv=1 exp 1000 req=1111 lock=0 -> grant=0001 gv=1 exp 0001 req=1111 lock=0 -> grant=0010 gv=1 exp 0010 -- lone requester (only 2): keeps winning req=0100 lock=0 -> grant=0100 gv=1 exp 0100 req=0100 lock=0 -> grant=0100 gv=1 exp 0100 -- idle keeps place, then req all: resume just past 2 -> 3 req=0000 lock=0 -> grant=0000 gv=0 exp 0000 gv0 req=1111 lock=0 -> grant=1000 gv=1 exp 1000 (idx3) -- reset, lock winner0 req=1111 lock=1 -> grant=0010 gv=1 exp 0001 latch req=1111 lock=1 -> grant=0010 gv=1 exp 0001 held req=1111 lock=1 -> grant=0010 gv=1 exp 0001 held -- lock drops, held req high: owns cycle, then resume at 1 req=1111 lock=0 -> grant=0010 gv=1 exp 0001 (last owned) req=1111 lock=0 -> grant=0100 gv=1 exp 0010 (idx1) -- reset, lock winner0 then dead air (req0 low) req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch req=1110 lock=1 -> grant=0000 gv=0 exp 0000 gv0 dead air (lock still high) req=1111 lock=1 -> grant=0010 gv=1 exp 0010 relatch idx1 (resume past dead 0) req=1111 lock=1 -> grant=0010 gv=1 exp 0010 held -- lock high but no grant: does nothing req=0000 lock=1 -> grant=0000 gv=0 exp 0000 gv0 req=1111 lock=0 -> grant=0100 gv=1 exp 0001 (place kept at 0) tb.sv:46: $finish called at 255 (1s)
cat > tb2.sv <<'EOF'
module tb2;
logic clk, rst, lock;
logic [3:0] req, grant;
logic grant_valid;
TopModule dut(.*);
initial begin clk=0; forever #5 clk=~clk; end
task cyc(input [3:0] r, input l, input string note);
req=r; lock=l; @(negedge clk);
$display("ptr=%0d hold=%b hidx=%0d | req=%b lock=%b -> grant=%b gv=%b %s",
dut.ptr,dut.hold,dut.hidx,req,lock,grant,grant_valid,note);
@(posedge clk);
endtask
task doreset;
req=0; lock=0; rst=1; @(posedge clk); #1; rst=0;
endtask
initial begin
doreset;
$display("-- reset then lock winner0 + dead air");
cyc(4'b1111,1,"exp 0001 latch");
cyc(4'b1110,1,"exp 0000 gv0 dead air");
cyc(4'b1111,1,"exp 0010 relatch idx1");
cyc(4'b1111,1,"exp 0010 held");
doreset;
$display("-- reset then lock hold, drop lock");
cyc(4'b1111,1,"exp 0001 latch");
cyc(4'b1111,1,"exp 0001 held");
cyc(4'b1111,0,"exp 0001 last owned");
cyc(4'b1111,0,"exp 0010 resume idx1");
$finish;
end
endmodule
EOF
iverilog -g2012 -o sim2 dut.sv tb2.sv && vvp sim2-- reset then lock winner0 + dead air ptr=0 hold=0 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch ptr=1 hold=1 hidx=0 | req=1110 lock=1 -> grant=0000 gv=0 exp 0000 gv0 dead air ptr=1 hold=0 hidx=0 | req=1111 lock=1 -> grant=0010 gv=1 exp 0010 relatch idx1 ptr=2 hold=1 hidx=1 | req=1111 lock=1 -> grant=0010 gv=1 exp 0010 held -- reset then lock hold, drop lock ptr=0 hold=0 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch ptr=1 hold=1 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 held ptr=1 hold=1 hidx=0 | req=1111 lock=0 -> grant=0001 gv=1 exp 0001 last owned ptr=1 hold=0 hidx=0 | req=1111 lock=0 -> grant=0010 gv=1 exp 0010 resume idx1 tb2.sv:29: $finish called at 95 (1s) [stdout] -- reset then lock winner0 + dead air ptr=0 hold=0 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch ptr=1 hold=1 hidx=0 | req=1110 lock=1 -> grant=0000 gv=0 exp 0000 gv0 dead air ptr=1 hold=0 hidx=0 | req=1111 lock=1 -> grant=0010 gv=1 exp 0010 relatch idx1 ptr=2 hold=1 hidx=1 | req=1111 lock=1 -> grant=0010 gv=1 exp 0010 held -- reset then lock hold, drop lock ptr=0 hold=0 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 latch ptr=1 hold=1 hidx=0 | req=1111 lock=1 -> grant=0001 gv=1 exp 0001 held ptr=1 hold=1 hidx=0 | req=1111 lock=0 -> grant=0001 gv=1 exp 0001 last owned ptr=1 hold=0 hidx=0 | req=1111 lock=0 -> grant=0010 gv=1 exp 0010 resume idx1 tb2.sv:29: $finish called at 95 (1s)
rm -f tb.sv tb2.sv sim sim2; ls /app
dut.sv [stdout] dut.sv
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.jD7pqG/runtime/cb_verifier_332-26336-4944-19833_332/results.jsonl"}Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_b1912327343448f0. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_b1912327343448f0 · verifier authoritative; classifier explanatory.