OpenFPGA/openfpga_flow/VerilogNetlists/lb_tb.v

200 lines
4.5 KiB
Verilog

//-----------------------------------------------------
// Design Name : testbench for logic blocks
// File Name : lb_tb.v
// Function : Configurable logic block
// Coder : Xifan TANG
//-----------------------------------------------------
//----- Time scale: simulation time step and accuracy -----
`timescale 1ns / 1ps
module lb_tb;
// Parameters
parameter SIZE_IN = 40; //---- MUX input size
parameter SIZE_OUT = 10; //---- MUX input size
parameter SIZE_RESERV_BLWL = 49 + 1; //---- MUX input size
parameter SIZE_BLWL = 1019 - 310 + 1; //---- MUX input size
parameter prog_clk_period = 1; // [ns] half clock period
parameter op_clk_period = 1; // [ns] half clock period
parameter config_period = 2 * prog_clk_period; // [ns] One full clock period
parameter operating_period = SIZE_IN * 2 * op_clk_period; // [ns] One full clock period
// Ports
wire [0:SIZE_IN-1] lb_in;
wire [0:SIZE_IN-1] lb_out;
wire lb_clk;
wire [0:SIZE_RESERV_BLWL-1] reserv_bl;
wire [0:SIZE_RESERV_BLWL-1] reserv_wl;
wire [0:SIZE_BLWL-1] bl;
wire [0:SIZE_BLWL-1] wl;
wire prog_EN;
wire prog_ENb;
wire zin;
wire nequalize;
wire read;
wire clk;
wire Reset;
wire Set;
// Clocks
wire prog_clock;
wire op_clock;
// Registered port
reg [0:SIZE_IN-1] lb_in_reg;
reg [0:SIZE_RESERV_BLWL-1] reserv_bl_reg;
reg [0:SIZE_RESERV_BLWL-1] reserv_wl_reg;
reg [0:SIZE_BLWL-1] bl_reg;
reg [0:SIZE_BLWL-1] wl_reg;
reg prog_clock_reg;
reg op_clock_reg;
// Config done signal;
reg config_done;
// Temp register for rotating shift
reg temp;
// Unit under test
grid_1__1_ U0 (
zin,
nequalize,
read,
clk,
Reset,
Set,
prog_ENb,
prog_EN,
// Top inputs
lb_in[0], lb_in[4], lb_in[8], lb_in[12], lb_in[16],
lb_in[20], lb_in[24], lb_in[28], lb_in[32], lb_in[36],
// Top outputs
lb_out[0], lb_out[4], lb_out[8],
// Right inputs
lb_in[1], lb_in[5], lb_in[9], lb_in[13], lb_in[17],
lb_in[21], lb_in[25], lb_in[29], lb_in[33], lb_in[37],
// Right outputs
lb_out[1], lb_out[5], lb_out[9],
// Bottom inputs
lb_in[2], lb_in[6], lb_in[10], lb_in[14], lb_in[18],
lb_in[22], lb_in[26], lb_in[30], lb_in[34], lb_in[38],
// Bottom outputs
lb_out[2], lb_out[6],
// Bottom inputs
lb_clk,
// left inputs
lb_in[3], lb_in[7], lb_in[11], lb_in[15], lb_in[19],
lb_in[23], lb_in[27], lb_in[31], lb_in[35], lb_in[39],
// left outputs
lb_out[3], lb_out[7],
reserv_bl, reserv_wl,
bl, wl
);
// Task: assign BL and WL values
task prog_lb_blwl;
begin
@(posedge prog_clock);
// Rotate left shift
temp = reserv_bl_reg[SIZE_RESERV_BLWL-1];
//bl_reg = bl_reg >> 1;
reserv_bl_reg[1:SIZE_RESERV_BLWL-1] = reserv_bl_reg[0:SIZE_RESERV_BLWL-2];
reserv_bl_reg[0] = temp;
end
endtask
// Task: assign inputs
task op_lb_in;
begin
@(posedge op_clock);
temp = lb_in_reg[SIZE_IN-1];
lb_in_reg[1:SIZE_IN-1] = lb_in_reg[0:SIZE_IN-2];
lb_in_reg[0] = temp;
end
endtask
// Configuration done signal
initial
begin
config_done = 1'b0;
end
// Enabled during config_period, Disabled during op_period
always
begin
#config_period config_done = ~config_done;
#operating_period config_done = ~config_done;
end
// Programming clocks
initial
begin
prog_clock_reg = 1'b0;
end
always
begin
#prog_clk_period prog_clock_reg = ~prog_clock_reg;
end
// Operating clocks
initial
begin
op_clock_reg = 1'b0;
end
always
begin
#op_clk_period op_clock_reg = ~op_clock_reg;
end
// Programming and Operating clocks
assign prog_clock = prog_clock_reg & (~config_done);
assign op_clock = op_clock_reg & config_done;
// Programming Enable signals
assign prog_EN = prog_clock & (~config_done);
assign prog_ENb = ~prog_EN;
// Programming phase: BL/WL
initial
begin
// Initialize BL/WL registers
reserv_bl_reg = {SIZE_RESERV_BLWL {1'b0}};
reserv_bl_reg[0] = 1'b1;
reserv_wl_reg = {SIZE_RESERV_BLWL {1'b0}};
// Reserved BL/WL
bl_reg = {SIZE_BLWL {1'b0}};
wl_reg = {SIZE_BLWL {1'b1}};
//wl_reg[SIZE_BLWL-1] = 1'b1;
end
always wait (~config_done) // Only invoked when config_done is 0
begin
// Propagate input 1 to the output
// BL[0] = 1, WL[4] = 1
prog_lb_blwl;
end
// Operating Phase
initial
begin
lb_in_reg = {SIZE_IN {1'b0}};
lb_in_reg[0] = 1'b1; // Last bit is 1 initially
end
always wait (config_done) // Only invoked when config_done is 1
begin
/* Update inputs */
op_lb_in;
end
// Wire ports
assign lb_in = lb_in_reg;
assign reserv_bl = reserv_bl_reg;
assign reserv_wl = reserv_wl_reg;
assign bl = bl_reg;
assign wl = wl_reg;
// Constant ports
assign zin = 1'b0;
assign nequalize = 1'b1;
assign read = 1'b0;
assign clk = op_clock;
assign Reset = ~config_done;
assign Set = 1'b0;
endmodule