200 lines
4.5 KiB
Verilog
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
|