Systolic Array (1)
Systolic Array (1)
wire [7:0] outa_0, outa_1, outa_2, outa_4, outa_5, outa_6, outa_8, outa_9,
outa_10, outa_12, outa_13, outa_14;
wire [7:0] outb_0, outb_1, outb_2, outb_3, outb_4, outb_5, outb_6, outb_7,
outb_8, outb_9, outb_10, outb_11;
wire [17:0] ARin_1, ARin_2, ARin_3, ARin_5, ARin_6, ARin_7, ARin_9,
ARin_10, ARin_11, ARin_13, ARin_14, ARin_15;
wire [17:0] ARout_0, ARout_1, ARout_2, ARout_4, ARout_5, ARout_6, ARout_8,
ARout_9, ARout_10, ARout_12, ARout_13, ARout_14;
PROCESSING_ELEMENT P0
(.ina(ina_0), .inb(inb_0), .clk(clk), .reset(reset), .outa(outa_0), .outb(ou
tb_0), .ARin(ARin_0), .ARout(ARout_0), .sel(sel));
PROCESSING_ELEMENT P1
(.ina(outa_0), .inb(inb_1), .clk(clk), .reset(reset), .outa(outa_1), .outb(ou
tb_1), .ARin(ARout_0), .ARout(ARout_1), .sel(sel));
PROCESSING_ELEMENT P2
(.ina(outa_1), .inb(inb_2), .clk(clk), .reset(reset), .outa(outa_2), .outb(ou
tb_2), .ARin(ARout_1), .ARout(ARout_2), .sel(sel));
PROCESSING_ELEMENT P3 (.ina(outa_2), .inb(inb_3), .clk(clk), .reset(reset),
.outa(outa_3), .outb(outb_3), .ARin(ARout_2), .ARout(ARout_3), .sel(sel));
PROCESSING_ELEMENT P4
(.ina(ina_4), .inb(outb_0), .clk(clk), .reset(reset), .outa(outa_4), .outb(ou
tb_4), .ARin(ARin_4), .ARout(ARout_4), .sel(sel));
PROCESSING_ELEMENT P5
(.ina(outa_4), .inb(outb_1), .clk(clk), .reset(reset), .outa(outa_5), .outb(ou
tb_5), .ARin(ARout_4), .ARout(ARout_5), .sel(sel));
PROCESSING_ELEMENT P6
(.ina(outa_5), .inb(outb_2), .clk(clk), .reset(reset), .outa(outa_6), .outb(ou
tb_6), .ARin(ARout_5), .ARout(ARout_6), .sel(sel));
PROCESSING_ELEMENT P7
(.ina(outa_6), .inb(outb_3), .clk(clk), .reset(reset), .outa(outa_7), .outb(ou
tb_7), .ARin(ARout_6), .ARout(ARout_7), .sel(sel));
PROCESSING_ELEMENT P8
(.ina(ina_8), .inb(outb_4), .clk(clk), .reset(reset), .outa(outa_8), .outb(ou
tb_8), .ARin(ARin_8), .ARout(ARout_8), .sel(sel));
PROCESSING_ELEMENT P9
(.ina(outa_8), .inb(outb_5), .clk(clk), .reset(reset), .outa(outa_9), .outb(ou
tb_9), .ARin(ARout_8), .ARout(ARout_9), .sel(sel));
PROCESSING_ELEMENT P10
(.ina(outa_9), .inb(outb_6), .clk(clk), .reset(reset), .outa(outa_10), .outb(ou
tb_10), .ARin(ARout_9), .ARout(ARout_10), .sel(sel));
PROCESSING_ELEMENT P11
(.ina(outa_10), .inb(outb_7), .clk(clk), .reset(reset), .outa(outa_11), .outb(ou
tb_11), .ARin(ARout_10), .ARout(ARout_11), .sel(sel));
PROCESSING_ELEMENT P12
(.ina(ina_12), .inb(outb_8), .clk(clk), .reset(reset), .outa(outa_12), .outb(o
utb_12), .ARin(ARin_12), .ARout(ARout_12), .sel(sel));
PROCESSING_ELEMENT P13
(.ina(outa_12), .inb(outb_9), .clk(clk), .reset(reset), .outa(outa_13), .outb(ou
tb_13), .ARin(ARout_12), .ARout(ARout_13), .sel(sel));
PROCESSING_ELEMENT P14
(.ina(outa_13), .inb(outb_10), .clk(clk), .reset(reset), .outa(outa_14), .outb(ou
tb_14), .ARin(ARout_13), .ARout(ARout_14), .sel(sel));
PROCESSING_ELEMENT P15
(.ina(outa_14), .inb(outb_11), .clk(clk), .reset(reset), .outa(outa_15), .outb(ou
tb_15), .ARin(ARout_14), .ARout(ARout_15), .sel(sel));
endmodule
input clk;
input reset;
input [7:0] ina;
input [7:0] inb;
output reg [7:0] outa;
output reg [7:0] outb;
input [17:0] ARin;
input sel;
output wire [17:0] ARout;
endmodule
// Adder module
module adder_18bit(
input [17:0] ar_reg,
input [15:0] mult_out,
output [17:0] ar_x
);
endmodule
//multiplier
`timescale 1ns / 1ps
endmodule
endmodule
wire [3:0] w;
assign mult[0]= a[0]&b[0];
assign w[0] = a[1]&b[0];
assign w[1] = a[0]&b[1];
assign w[2] = a[1]&b[1];
endmodule
module halfAdder(a,b,sum,carry);
input a,b;
output sum, carry;
assign sum = a ^ b;
assign carry = a & b;
endmodule
module adder4(a,b,sum);
assign sum = a + b;
endmodule
module adder6(a,b,sum);
assign sum = a + b;
endmodule
module adder8(a,b,sum);
assign sum = a + b;
endmodule
module adder10(a,b,sum);
assign sum = a + b;
endmodule
testbench
module systolic_array_tb;
// Inputs
reg [7:0] ina_0, ina_4, ina_8, ina_12;
reg [7:0] inb_0, inb_1, inb_2, inb_3;
reg clk, reset, sel;
reg [17:0] ARin_0, ARin_4, ARin_8, ARin_12;
// Outputs
wire [7:0] outa_3, outa_7, outa_11, outa_15;
wire [7:0] outb_12, outb_13, outb_14, outb_15;
wire [17:0] ARout_3, ARout_7, ARout_11, ARout_15;
initial begin
// Initialize Inputs
ina_0 = 0; ina_4 = 0; ina_8 = 0; ina_12 = 0;
inb_0 = 0; inb_1 = 0; inb_2 = 0; inb_3 = 0;
clk = 0; reset = 0; sel = 0;
ARin_0 = 0; ARin_4 = 0; ARin_8 = 0; ARin_12 = 0;
// Test case 1
ina_0 = 8'h01; ina_4 = 8'h02; ina_8 = 8'h03; ina_12 = 8'h04;
inb_0 = 8'h05; inb_1 = 8'h06; inb_2 = 8'h07; inb_3 = 8'h08;
ARin_0 = 18'h00001; ARin_4 = 18'h00002; ARin_8 = 18'h00003; ARin_12 =
18'h00004;
#20;
// Test case 2
ina_0 = 8'h09; ina_4 = 8'h0A; ina_8 = 8'h0B; ina_12 = 8'h0C;
inb_0 = 8'h0D; inb_1 = 8'h0E; inb_2 = 8'h0F; inb_3 = 8'h10;
ARin_0 = 18'h00005; ARin_4 = 18'h00006; ARin_8 = 18'h00007; ARin_12 =
18'h00008;
#20;
endmodule