module lab2_tb();
// constant declarations
localparam PKT_WIDTH = 96;
localparam DATA_WIDTH = 32;

// one reg type var for each input of the circuit
reg clk;
reg [DATA_WIDTH-1:0] data_i;
reg valid_i;

// one wire type var for the outputs
wire [DATA_WIDTH-1:0] data_o;
wire valid_o;


lab2 lab2 (
	.clk (clk),
	.data_i (data_i),
	.valid_i (valid_i),
	.data_o (data_o),
	.valid_o (valid_o)
);

initial begin
	clk = 0;
end

always begin 
	clk = ~clk;
	#50;
end

task waitalot;
begin
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
end
endtask

initial begin
	data_i = 0;
	valid_i = 0;
	
	// let's wait a few clock cycles before sending any data in
	@(negedge clk);
	@(negedge clk);
	@(negedge clk);
	
	valid_i = 1'b1;
	
	@(negedge clk);
	
	data_i = {29'd123,3'b101}; // data + header
	valid_i = 1'b1;
	
	@(negedge clk);

	data_i = 32'd321; // data
	valid_i = 1'b1;
	
	@(negedge clk);
	
	data_i = {3'b010,10'd98,10'd99,6'd5,3'b101}; // tail + source + destination + hops + data
	valid_i = 1'b1;
	
	@(negedge clk);
	data_i = 32'd0;
	valid_i = 1'b0;
	
	waitalot;
	// building a package with a broken header

	valid_i = 1'b1;
	@(negedge clk);
	data_i = {29'd1234,3'b111}; // data + header
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd3210; // data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = {3'b010,10'd980,10'd990,6'd8,3'b101}; // tail + source + destination + hops + data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd0;
	valid_i = 1'b0;
	
	waitalot;
	// building a package with a broken tail

	valid_i = 1'b1;
	@(negedge clk);
	data_i = {29'd1234,3'b101}; // data + header
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd3210; // data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = {3'b000,10'd980,10'd990,6'd9,3'b101}; // tail + source + destination + hops + data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd0;
	valid_i = 1'b0;
	
	waitalot;
	// building a package with too many hops

	valid_i = 1'b1;
	@(negedge clk);
	data_i = {29'd1234,3'b101}; // data + header
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd3210; // data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = {3'b010,10'd980,10'd990,6'd21,3'b101}; // tail + source + destination + hops + data
	valid_i = 1'b1;
	@(negedge clk);
	data_i = 32'd0;
	valid_i = 1'b0;
	
	waitalot;
	$finish();	
end

endmodule
