Source / Read the circuit

tb_stream.sv

lessons/adc_digital/tb/tb_stream.sv

`timescale 1ns/1ps
module tb_stream;
    reg clk=0; always #5 clk=~clk;
    reg rst_n=0, commit=0;
    reg [71:0] offsets=0,gains=0;
    reg [3:0] rv=0;
    reg [47:0] raw=0; reg [127:0] ids=0; reg [63:0] epochs=0;
    wire [3:0] req; wire [31:0] sample_id;
    wire ov,sat,fault; wire signed [17:0] data; wire [65:0] meta;
    ti_adc_backend dut(.clk(clk),.rst_n(rst_n),.epoch(16'd3),.sample_req(req),.sample_id(sample_id),
        .rsp_valid(rv),.rsp_raw(raw),.rsp_id(ids),.rsp_epoch(epochs),.cfg_commit(commit),
        .cfg_offsets(offsets),.cfg_gains(gains),.cfg_accepted(),.cfg_rejected(),.cfg_applied(),.applied_id(),
        .sink_ready(1'b1),.out_valid(ov),.out_sat(sat),.out_data(data),.out_meta(meta),
        .fault(fault),.fault_code(),.fault_id(),.fault_tick(),.snapshot(1'b0),.stats_snapshot());
    integer values[0:65539]; integer queued_id[0:3],due[0:3],delay[0:3];
    reg pending[0:3];
    integer fd,cf,of,rc,n,t,lane,received=0;
    initial begin
        fd=$fopen("raw.txt","r"); cf=$fopen("coefficients.txt","r"); of=$fopen("stream.txt","w");
        if(!fd || !cf || !of) $fatal(1,"stream files");
        rc=$fscanf(cf,"%h %h\n",offsets,gains); if(rc!=2) $fatal(1,"stream coefficients");
        for(n=0;n<65540;n=n+1) begin rc=$fscanf(fd,"%d\n",values[n]);
            if(rc!=1) $fatal(1,"stream raw %0d",n); end
        $fclose(fd); $fclose(cf);
        delay[0]=18; delay[1]=52; delay[2]=9; delay[3]=31;
        for(lane=0;lane<4;lane=lane+1) begin pending[lane]=0; queued_id[lane]=0; due[lane]=0; end
        repeat(3) @(negedge clk); rst_n=1;
        for(t=0;received<65540;t=t+1) begin
            rv=0; raw=0; ids=0; epochs=0; commit=(t==10);
            for(lane=0;lane<4;lane=lane+1) if(pending[lane] && due[lane]==t) begin
                rv[lane]=1; raw[lane*12+:12]=values[queued_id[lane]];
                ids[lane*32+:32]=queued_id[lane]; epochs[lane*16+:16]=16'd3;
            end
            @(posedge clk);
            for(lane=0;lane<4;lane=lane+1) if(rv[lane]) pending[lane]=0;
            if(req!=0 && sample_id<65540) begin
                lane=sample_id%4;
                if(pending[lane]) $fatal(1,"stream lane overlapping conversion");
                pending[lane]=1; queued_id[lane]=sample_id; due[lane]=t+delay[lane];
            end
            #1;
            if(fault) $fatal(1,"stream backend fault at tick=%0d",t);
            if(ov) begin
                $fwrite(of,"%0d %0d %0d %0d %0d\n",meta[33:2],data,sat,meta[49:34],meta[65:50]);
                received=received+1;
            end
            @(negedge clk);
        end
        $fclose(of); $display("ADC_STREAM_SIMULATION_COMPLETE samples=%0d cycles=%0d",received,t); $finish;
    end
    initial begin #20000000; $fatal(1,"stream watchdog"); end
endmodule