Source / Read the circuit
tb_fixed.sv
lessons/adc_digital/tb/tb_fixed.sv
`timescale 1ns/1ps
module tb_fixed;
reg clk=0; always #5 clk=~clk;
reg rst_n=0, flush=0, valid=0;
reg signed [11:0] raw;
reg signed [17:0] offset,gain;
reg [65:0] meta;
wire ov,sat; wire signed [17:0] data; wire [65:0] tag;
adc_fixed_correct dut(.clk(clk),.rst_n(rst_n),.flush(flush),.in_valid(valid),
.raw(raw),.offset(offset),.inverse_gain(gain),.meta(meta),
.out_valid(ov),.sat(sat),.data(data),.out_meta(tag));
integer exp_data[0:20000], exp_sat[0:20000], exp_cycle[0:20000];
integer count=0, received=0, cycle=0, fd,rc,r,o,g,y,s,seed=1551;
reg [31:0] random_value;
always @(posedge clk) begin
if(!rst_n) cycle=0;
else begin
cycle=cycle+1;
#1;
if(ov) begin
if(data!==exp_data[received][17:0] || sat!==exp_sat[received][0] ||
tag!=received || cycle!=exp_cycle[received]+4)
$fatal(1,"fixed mismatch index=%0d got=%0d expected=%0d cycle=%0d",received,data,exp_data[received],cycle);
received=received+1;
end
end
end
initial begin
raw=0; offset=0; gain=0; meta=0;
repeat(3) @(negedge clk); rst_n=1;
fd=$fopen("fixed_vectors.txt","r"); if(!fd) $fatal(1,"fixed vectors missing");
while(!$feof(fd)) begin
rc=$fscanf(fd,"%d %d %d %d %d\n",r,o,g,y,s);
if(rc==5) begin
@(negedge clk);
random_value=$random(seed);
if(random_value%5==0) begin valid=0; @(negedge clk); end
valid=1; raw=r; offset=o; gain=g; meta=count;
exp_data[count]=y; exp_sat[count]=s; exp_cycle[count]=cycle+1; count=count+1;
end else if(!$feof(fd)) $fatal(1,"fixed vectors parse");
end
$fclose(fd); @(negedge clk); valid=0; repeat(6) @(negedge clk);
if(received!=count) $fatal(1,"fixed lost output");
// Flush abandons in-flight data; no stale output after it.
valid=1; repeat(2) @(negedge clk); valid=0; flush=1;
@(negedge clk); flush=0; repeat(6) @(negedge clk);
if(ov || received!=count) $fatal(1,"fixed flush leak");
$display("PASS AD15 FIXED vectors=%0d latency=4 random-idle flush saturation negative-ties",count);
$display("ADC_FIXED_COMPLETE"); $finish;
end
initial begin #10000000; $fatal(1,"fixed watchdog"); end
endmodule