218 lines
3.8 KiB
Coq
218 lines
3.8 KiB
Coq
|
//module calibration testbench
|
||
|
//data_caled calculate: address's square
|
||
|
`timescale 1 ns / 1 ns
|
||
|
module calibration_tb();
|
||
|
|
||
|
localparam CLK_PERIOD = 20;
|
||
|
|
||
|
reg clk;
|
||
|
reg rst;
|
||
|
|
||
|
//avalon ST(Streaming) sink: 0 readlatency and 0 readallowence
|
||
|
reg [15:0] data_in_data;
|
||
|
wire data_in_ready;
|
||
|
wire data_in_valid;
|
||
|
reg data_in_empty;
|
||
|
reg data_in_startofpacket;
|
||
|
reg data_in_endofpacket;
|
||
|
|
||
|
reg to_udp_ready;
|
||
|
|
||
|
//the interface with cali_ram (storing cali factor) Avalon-MM: read califac from this ram
|
||
|
wire [8:0] address;
|
||
|
wire [15:0] cali_fac;
|
||
|
wire clken;
|
||
|
|
||
|
reg [8:0] data_caled_address;
|
||
|
wire [15:0] data_caled;
|
||
|
wire data_caled_rd_enable;
|
||
|
|
||
|
reg [15:0] data_a;
|
||
|
wire wren_a;
|
||
|
reg [8:0] wr_address;
|
||
|
reg start_wr;
|
||
|
|
||
|
|
||
|
|
||
|
reg [2:0] state;
|
||
|
localparam STATE_IDLE = 3'd0;
|
||
|
localparam STATE_WR = 3'd1;
|
||
|
localparam STATE_LOC0 = 3'd2;
|
||
|
localparam STATE_SEND = 3'd3;
|
||
|
localparam STATE_LOC1 = 3'd4;
|
||
|
localparam STATE_RD = 3'd5;
|
||
|
localparam STATE_LOC2 = 3'd6;
|
||
|
|
||
|
assign data_caled_rd_enable = (state == STATE_RD)? 1'b1: 1'b0;
|
||
|
|
||
|
|
||
|
//
|
||
|
reg waitrequest;
|
||
|
always @(posedge clk) begin
|
||
|
if (clken)
|
||
|
waitrequest<=1'b0;
|
||
|
else
|
||
|
waitrequest <= 1'b1;
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
//the ram for store the cali_fac in testbench
|
||
|
ram_sim cal_fac_simulation_ram (
|
||
|
.clock ( clk ),
|
||
|
.address_a (wr_address),
|
||
|
.data_a (data_a),
|
||
|
.wren_a (wren_a),
|
||
|
.rden_a (1'b0),
|
||
|
.q_a (),
|
||
|
|
||
|
.address_b ( address ),
|
||
|
.data_b ( ),
|
||
|
.rden_b (clken),
|
||
|
.wren_b (1'b0),
|
||
|
.q_b ( cali_fac)
|
||
|
);
|
||
|
|
||
|
calibration calibration_dut(
|
||
|
|
||
|
.clk(clk),
|
||
|
.rst(rst),
|
||
|
|
||
|
.data_in_data (data_in_data),
|
||
|
.data_in_ready (data_in_ready),
|
||
|
.data_in_valid (data_in_valid),
|
||
|
.data_in_empty (data_in_empty),
|
||
|
.data_in_startofpacket (data_in_startofpacket),
|
||
|
.data_in_endofpacket (data_in_endofpacket),
|
||
|
|
||
|
.address (address),
|
||
|
.clken (clken),
|
||
|
.cali_fac (cali_fac),
|
||
|
.waitrequest(waitrequest),
|
||
|
|
||
|
.data_caled_address(data_caled_address),
|
||
|
.data_caled(data_caled),
|
||
|
.data_caled_rd_enable(data_caled_rd_enable),
|
||
|
|
||
|
.to_udp_ready(to_udp_ready)
|
||
|
|
||
|
);
|
||
|
|
||
|
|
||
|
initial begin
|
||
|
|
||
|
clk = 1'b1;
|
||
|
rst = 1'b1;
|
||
|
|
||
|
data_in_data = 0;
|
||
|
data_in_empty = 2'b0;
|
||
|
data_in_startofpacket = 1'b0;
|
||
|
data_in_endofpacket = 1'b0;
|
||
|
start_wr = 1'b0;
|
||
|
to_udp_ready = 1'b0;
|
||
|
|
||
|
state = STATE_IDLE;
|
||
|
|
||
|
|
||
|
#(CLK_PERIOD*2 + 1);
|
||
|
rst = 1'b0;
|
||
|
start_wr = 1'b1;
|
||
|
|
||
|
#(CLK_PERIOD*2);
|
||
|
start_wr = 1'b0;
|
||
|
|
||
|
#(CLK_PERIOD*400);
|
||
|
|
||
|
|
||
|
//start packet
|
||
|
#(CLK_PERIOD*2+1);
|
||
|
data_in_startofpacket = 1'b1;
|
||
|
#(CLK_PERIOD*2);
|
||
|
to_udp_ready = 1'b1;
|
||
|
|
||
|
#(CLK_PERIOD*10);
|
||
|
to_udp_ready = 1'b0;
|
||
|
#(CLK_PERIOD*10);
|
||
|
to_udp_ready = 1'b1;
|
||
|
#(CLK_PERIOD*309);
|
||
|
//end packet
|
||
|
data_in_endofpacket = 1'b1;
|
||
|
|
||
|
|
||
|
#(CLK_PERIOD*500); $stop;
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
//clk
|
||
|
always #(CLK_PERIOD/2) clk = ~ clk;
|
||
|
|
||
|
assign data_in_valid = (state == STATE_SEND || data_in_startofpacket || data_in_endofpacket)? 1'b1 : 1'b0;
|
||
|
assign wren_a = (state == STATE_WR)? 1'b1: 1'b0;
|
||
|
always @(posedge clk) begin
|
||
|
case(state)
|
||
|
STATE_IDLE:
|
||
|
begin
|
||
|
wr_address <= 0;
|
||
|
data_a <= 0;
|
||
|
data_caled_address <= 0;
|
||
|
if (start_wr)
|
||
|
begin
|
||
|
state <= STATE_WR;
|
||
|
end
|
||
|
end
|
||
|
STATE_WR:
|
||
|
begin
|
||
|
wr_address <= wr_address + 1;
|
||
|
data_a <= data_a + 1;
|
||
|
if (wr_address == 319)
|
||
|
begin
|
||
|
state <= STATE_LOC0;
|
||
|
end
|
||
|
end
|
||
|
STATE_LOC0:
|
||
|
begin
|
||
|
if (data_in_startofpacket && data_in_ready)
|
||
|
begin
|
||
|
state <= STATE_SEND;
|
||
|
data_in_data <= data_in_data + 1;
|
||
|
data_in_startofpacket <= 1'b0;
|
||
|
end
|
||
|
end
|
||
|
STATE_SEND:
|
||
|
begin
|
||
|
if (data_in_ready)
|
||
|
begin
|
||
|
if (data_in_endofpacket) begin
|
||
|
state <= STATE_LOC1;
|
||
|
data_in_data <= 0;
|
||
|
data_in_endofpacket <= 1'b0;
|
||
|
end else begin
|
||
|
data_in_data <= data_in_data + 1;
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
STATE_LOC1:
|
||
|
begin
|
||
|
state <= STATE_RD;
|
||
|
end
|
||
|
STATE_RD:
|
||
|
begin
|
||
|
data_caled_address <= data_caled_address + 1;
|
||
|
if (data_caled_address == 319)
|
||
|
state <= STATE_LOC2;
|
||
|
end
|
||
|
STATE_LOC2:
|
||
|
state <= STATE_IDLE;
|
||
|
endcase
|
||
|
end
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
endmodule
|