tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.module TopModule(
input clk,
input rst,
input a_req_i,
input [7:0] a_addr_i,
output reg a_ack_o,
output reg [15:0] a_data_o,
input b_req_i,
input [7:0] b_addr_i,
output reg b_ack_o,
output reg [15:0] b_data_o,
output reg m_req_o,
output reg [7:0] m_addr_o,
input [15:0] m_data_i
);
localparam [2:0] IDLE = 3'd0,
ISSUE = 3'd1,
W1 = 3'd2,
W2 = 3'd3,
ACK = 3'd4;
reg [2:0] state;
// Requests/addresses registered one cycle (so a fresh request is sampled
// one idle cycle after it first appears -> that sample edge is E).
reg ra, rb;
reg [7:0] aa, ab;
reg last; // who won the last op: 0 = A, 1 = B
reg hot; // next IDLE sample is the anti-starvation (post-op) sample
// Combinational arbitration for an IDLE sample.
reg do_issue; // a requester is selected
reg win; // selected requester: 0 = A, 1 = B
always @(*) begin
do_issue = 1'b0;
win = 1'b0;
if (ra || rb) begin
do_issue = 1'b1;
if (hot) begin
// Prefer the requester that did NOT just win; else the one that did.
if (last == 1'b0) begin
// A won last -> prefer B
win = rb ? 1'b1 : 1'b0;
end else begin
// B won last -> prefer A
win = ra ? 1'b0 : 1'b1;
end
end else begin
// Cold sample: favour A.
win = ra ? 1'b0 : 1'b1;
end
end
end
always @(posedge clk) begin
if (rst) begin
state <= IDLE;
ra <= 1'b0; rb <= 1'b0;
aa <= 8'd0; ab <= 8'd0;
last <= 1'b0; hot <= 1'b0;
m_req_o <= 1'b0;
m_addr_o <= 8'd0;
a_ack_o <= 1'b0;
a_data_o <= 16'd0;
b_ack_o <= 1'b0;
b_data_o <= 16'd0;
end else begin
// Register requester inputs every cycle.
ra <= a_req_i;
rb <= b_req_i;
aa <= a_addr_i;
ab <= b_addr_i;
// Registered-output defaults (single-cycle pulses).
m_req_o <= 1'b0;
a_ack_o <= 1'b0;
b_ack_o <= 1'b0;
case (state)
IDLE: begin
if (do_issue) begin
m_req_o <= 1'b1; // command during E+1 only
m_addr_o <= win ? ab : aa;
last <= win;
state <= ISSUE;
end else begin
hot <= 1'b0; // idle stretch resets arbitration
state <= IDLE;
end
end
ISSUE: begin // E+1
state <= W1;
end
W1: begin // E+2
state <= W2;
end
W2: begin // E+3: m_data_i valid, capture it
if (last == 1'b0) begin
a_ack_o <= 1'b1;
a_data_o <= m_data_i;
end else begin
b_ack_o <= 1'b1;
b_data_o <= m_data_i;
end
state <= ACK;
end
ACK: begin // E+4: ack high one cycle
hot <= 1'b1; // E+5 sample is anti-starvation
state <= IDLE;
end
default: state <= IDLE;
endcase
end
end
endmodule
Lint/compile the module
(iverilog -g2012 -o /tmp/dut.out dut.sv 2>&1 && echo "iverilog OK") || (verilator --lint-only -Wall dut.sv 2>&1 && echo "verilator OK") || echo "no simulator available"
iverilog OK [stdout] iverilog OK
Run sanity testbench
cat > /tmp/tb.sv <<'EOF'
module tb;
reg clk=0, rst=1;
reg a_req=0,b_req=0; reg [7:0] a_addr=0,b_addr=0;
wire a_ack,b_ack; wire [15:0] a_data,b_data;
wire m_req; wire [7:0] m_addr; reg [15:0] m_data=0;
integer cyc=0;
TopModule dut(.clk(clk),.rst(rst),
.a_req_i(a_req),.a_addr_i(a_addr),.a_ack_o(a_ack),.a_data_o(a_data),
.b_req_i(b_req),.b_addr_i(b_addr),.b_ack_o(b_ack),.b_data_o(b_data),
.m_req_o(m_req),.m_addr_o(m_addr),.m_data_i(m_data));
always #5 clk=~clk;
// fake memory: 2-cycle latency, data = addr+100 captured when m_req seen
reg [7:0] cmd_addr; reg [1:0] lat=0;
always @(posedge clk) begin
if (m_req) begin cmd_addr<=m_addr; lat<=1; end
else if (lat==1) begin m_data <= cmd_addr+100; lat<=0; end
end
always @(posedge clk) begin
cyc<=cyc+1;
$display("cyc=%0d st(m_req=%b a=%0d) a_ack=%b a_data=%0d b_ack=%b b_data=%0d",
cyc,m_req,m_addr,a_ack,a_data,b_ack,b_data);
end
initial begin
@(negedge clk); rst=1; @(negedge clk); rst=0;
// both request from cold at cyc ~2
a_addr=8'd7; b_addr=8'd9; a_req=1; b_req=1;
repeat(16) @(negedge clk);
a_req=0; b_req=0;
repeat(4) @(negedge clk);
$finish;
end
endmodule
EOF
iverilog -g2012 -o /tmp/t.out /tmp/dut.out.dummy 2>/dev/null; iverilog -g2012 -o /tmp/t.out dut.sv /tmp/tb.sv && vvp /tmp/t.outcyc=0 st(m_req=x a=x) a_ack=x a_data=x b_ack=x b_data=x cyc=1 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=2 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=3 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=4 st(m_req=1 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=5 st(m_req=0 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=6 st(m_req=0 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=7 st(m_req=0 a=7) a_ack=1 a_data=107 b_ack=0 b_data=0 cyc=8 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=9 st(m_req=1 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=10 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=11 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=12 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=1 b_data=109 cyc=13 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=14 st(m_req=1 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=15 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=16 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=17 st(m_req=0 a=7) a_ack=1 a_data=107 b_ack=0 b_data=109 cyc=18 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=19 st(m_req=1 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=20 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=21 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 /tmp/tb.sv:35: $finish called at 220 (1s) [stdout] cyc=0 st(m_req=x a=x) a_ack=x a_data=x b_ack=x b_data=x cyc=1 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=2 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=3 st(m_req=0 a=0) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=4 st(m_req=1 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=5 st(m_req=0 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=6 st(m_req=0 a=7) a_ack=0 a_data=0 b_ack=0 b_data=0 cyc=7 st(m_req=0 a=7) a_ack=1 a_data=107 b_ack=0 b_data=0 cyc=8 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=9 st(m_req=1 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=10 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=11 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=0 cyc=12 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=1 b_data=109 cyc=13 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=14 st(m_req=1 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=15 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=16 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=17 st(m_req=0 a=7) a_ack=1 a_data=107 b_ack=0 b_data=109 cyc=18 st(m_req=0 a=7) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=19 st(m_req=1 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=20 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 cyc=21 st(m_req=0 a=9) a_ack=0 a_data=107 b_ack=0 b_data=109 /tmp/tb.sv:35: $finish called at 220 (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 dut_compiles: PASS (compiled with held-back reference/testbench)
TEST simulation_completed: PASS (Mismatches: 0 in 3839 samples)
TEST reference_equivalence: PASS (all 3839 samples matched reference)
{"score": 1.000000, "results_file": "/tmp/h2t-grader-home.dkdO47/runtime/cb_verifier_316-29931-3646-27213_316/results.jsonl"}Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_8f2d0d1fdf394284. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_8f2d0d1fdf394284 · verifier authoritative; classifier explanatory.