附上代码:
PE:
module PE_module(CLK,RSTn,W,XIN,PEIN,XOUT,PEOUT);
parameter DATAWIDTN = 8;
input CLK;
input RSTn;
input [ DATAWIDTN - 1 : 0 ] XIN;
input [ DATAWIDTN - 1 : 0 ] W;
input [ DATAWIDTN * 2 - 1 : 0 ] PEIN;
output [ DATAWIDTN - 1 : 0 ] XOUT;
output [ DATAWIDTN * 2 - 1 : 0 ] PEOUT;
reg [ DATAWIDTN - 1 : 0 ] XOUT;
reg [ DATAWIDTN * 2 - 1 : 0 ] PEOUT;
always @ ( posedge CLK or negedge RSTn )
begin
if (!RSTn)
begin
XOUT <= 0;
PEOUT <= 0;
end
else
begin
XOUT <= XIN;
PEOUT <= PEIN+XIN*W;
end
end
endmodule
Systolic_Array:
module Systolic_Array(CLK,RSTn,W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33,XIN0,XIN1,XIN2,XIN3,PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT);
parameter DATAWIDTN = 8;
input CLK,RSTn;
input [ DATAWIDTN - 1 : 0 ] XIN0,XIN1,XIN2,XIN3;
output [ DATAWIDTN * 2 - 1 : 0 ] PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT;
input [ DATAWIDTN - 1 : 0 ] W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33;
wire [ DATAWIDTN - 1 : 0 ] XOUT00_10,XOUT10_20,XOUT20_30,XOUT30_OUT,
XOUT01_11,XOUT11_21,XOUT21_31,XOUT31_OUT,
XOUT02_12,XOUT12_22,XOUT22_32,XOUT32_OUT,
XOUT03_13,XOUT13_23,XOUT23_33,XOUT33_OUT;
wire [ DATAWIDTN * 2 - 1 : 0 ] PE00_01,PE01_02,PE02_03,PE03_OUT,
PE10_11,PE11_12,PE12_13,PE13_OUT,
PE20_21,PE21_22,PE22_23,PE23_OUT,
PE30_31,PE31_32,PE32_33,PE33_OUT;
PE_module PE00(.CLK(CLK),.RSTn(RSTn),.W(W00),.XIN(XIN0), .PEIN(0), .XOUT(XOUT00_10), .PEOUT(PE00_01));
PE_module PE10(.CLK(CLK),.RSTn(RSTn),.W(W10),.XIN(XOUT00_10),.PEIN(0), .XOUT(XOUT10_20), .PEOUT(PE10_11));
PE_module PE20(.CLK(CLK),.RSTn(RSTn),.W(W20),.XIN(XOUT10_20),.PEIN(0), .XOUT(XOUT20_30), .PEOUT(PE20_21));
PE_module PE30(.CLK(CLK),.RSTn(RSTn),.W(W30),.XIN(XOUT20_30),.PEIN(0), .XOUT(XOUT30_OUT),.PEOUT(PE30_31));
PE_module PE01(.CLK(CLK),.RSTn(RSTn),.W(W01),.XIN(XIN1), .PEIN(PE00_01),.XOUT(XOUT01_11), .PEOUT(PE01_02));
PE_module PE11(.CLK(CLK),.RSTn(RSTn),.W(W11),.XIN(XOUT01_11),.PEIN(PE10_11),.XOUT(XOUT11_21), .PEOUT(PE11_12));
PE_module PE21(.CLK(CLK),.RSTn(RSTn),.W(W21),.XIN(XOUT11_21),.PEIN(PE20_21),.XOUT(XOUT21_31), .PEOUT(PE21_22));
PE_module PE31(.CLK(CLK),.RSTn(RSTn),.W(W31),.XIN(XOUT21_31),.PEIN(PE30_31),.XOUT(XOUT31_OUT),.PEOUT(PE31_32));
PE_module PE02(.CLK(CLK),.RSTn(RSTn),.W(W02),.XIN(XIN2), .PEIN(PE01_02),.XOUT(XOUT02_12), .PEOUT(PE02_03));
PE_module PE12(.CLK(CLK),.RSTn(RSTn),.W(W12),.XIN(XOUT02_12),.PEIN(PE11_12),.XOUT(XOUT12_22), .PEOUT(PE12_13));
PE_module PE22(.CLK(CLK),.RSTn(RSTn),.W(W22),.XIN(XOUT12_22),.PEIN(PE21_22),.XOUT(XOUT22_32), .PEOUT(PE22_23));
PE_module PE32(.CLK(CLK),.RSTn(RSTn),.W(W32),.XIN(XOUT22_32),.PEIN(PE31_32),.XOUT(XOUT32_OUT),.PEOUT(PE32_33));
PE_module PE03(.CLK(CLK),.RSTn(RSTn),.W(W03),.XIN(XIN3), .PEIN(PE02_03),.XOUT(XOUT03_13), .PEOUT(PE03_OUT));
PE_module PE13(.CLK(CLK),.RSTn(RSTn),.W(W13),.XIN(XOUT03_13),.PEIN(PE12_13),.XOUT(XOUT13_23), .PEOUT(PE13_OUT));
PE_module PE23(.CLK(CLK),.RSTn(RSTn),.W(W23),.XIN(XOUT13_23),.PEIN(PE22_23),.XOUT(XOUT23_33), .PEOUT(PE23_OUT));
PE_module PE33(.CLK(CLK),.RSTn(RSTn),.W(W33),.XIN(XOUT23_33),.PEIN(PE32_33),.XOUT(XOUT33_OUT),.PEOUT(PE33_OUT));
endmodule
Systolic_Array_tb:
`timescale 1ns / 1ps
module Systolic_Array_tb();
parameter DATAWIDTN = 8;
reg CLK,RSTn;
reg [ DATAWIDTN - 1 : 0 ] XIN0,XIN1,XIN2,XIN3;
reg [ DATAWIDTN - 1 : 0 ] W00,W01,W02,W03,
W10,W11,W12,W13,
W20,W21,W22,W23,
W30,W31,W32,W33;
wire [ DATAWIDTN - 1 : 0 ] XOUT00_10,XOUT10_20,XOUT20_30,XOUT30_OUT,
XOUT01_11,XOUT11_21,XOUT21_31,XOUT31_OUT,
XOUT02_12,XOUT12_22,XOUT22_32,XOUT32_OUT,
XOUT03_13,XOUT13_23,XOUT23_33,XOUT33_OUT;
wire [ DATAWIDTN * 2 - 1 : 0 ] PE00_01,PE01_02,PE02_03,PE03_OUT,
PE10_11,PE11_12,PE12_13,PE13_OUT,
PE20_21,PE21_22,PE22_23,PE23_OUT,
PE30_31,PE31_32,PE32_33,PE33_OUT;
Systolic_Array tb_Systolic_Array(CLK,RSTn,W00,W01,W02,W03,W10,W11,W12,W13,W20,W21,W22,W23,W30,W31,W32,W33,XIN0,XIN1,XIN2,XIN3,PE03_OUT,PE13_OUT,PE23_OUT,PE33_OUT);
initial CLK = 0;
always #5 CLK = ~ CLK;
initial
begin
CLK =1'b1;
RSTn =1'b1;
XIN0 = 101;
XIN1 = 0;
XIN2 = 0;
XIN3 = 0;
W00 = 1;
W01 = 2;
W02 = 3;
W03 = 4;
W10 = 5;
W11 = 6;
W12 = 7;
W13 = 8;
W20 = 9;
W21 = 10;
W22 = 11;
W23 = 12;
W30 = 13;
W31 = 14;
W32 = 15;
W33 = 16;
#10
XIN0 = 102;
XIN1 = 113;
XIN2 = 0;
XIN3 = 0;
#10
XIN0 = 103;
XIN1 = 114;
XIN2 = 125;
XIN3 = 0;
#10
XIN0 = 104;
XIN1 = 115;
XIN2 = 126;
XIN3 = 137;
#10
XIN0 = 105;
XIN1 = 116;
XIN2 = 127;
XIN3 = 138;
#10
XIN0 = 106;
XIN1 = 117;
XIN2 = 128;
XIN3 = 139;
#10
XIN0 = 107;
XIN1 = 118;
XIN2 = 129;
XIN3 = 140;
#10
XIN0 = 108;
XIN1 = 119;
XIN2 = 130;
XIN3 = 141;
#10
XIN0 = 109;
XIN1 = 120;
XIN2 = 131;
XIN3 = 142;
#10
XIN0 = 110;
XIN1 = 121;
XIN2 = 132;
XIN3 = 143;
#10
XIN0 = 111;
XIN1 = 122;
XIN2 = 133;
XIN3 = 144;
#10
XIN0 = 112;
XIN1 = 123;
XIN2 = 134;
XIN3 = 145;
#10
XIN0 = 0;
XIN1 = 124;
XIN2 = 135;
XIN3 = 146;
#10
XIN0 = 0;
XIN1 = 0;
XIN2 = 136;
XIN3 = 147;
#10
XIN0 = 0;
XIN1 = 0;
XIN2 = 0;
XIN3 = 148;
#10
XIN0 = 0;
XIN1 = 0;
XIN2 = 0;
XIN3 = 0;
end
endmodule
上面代码格式调整不了,例化程序那里往前靠靠。