Skip to content

Commit f521888

Browse files
author
Anish
committed
Initial Commit
1 parent ca5d69f commit f521888

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+4986
-0
lines changed

Code/Makefile.vcs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
include $(UVM_HOME)/Makefile.vcs
2+
UVM_VERBOSITY = UVM_HIGH
3+
DUT_DIR = ./Processor
4+
TEST_DIR = .
5+
TEST_NAME = processor_test
6+
SEED = 14788478
7+
DUT_SOURCES = \
8+
+incdir+$(DUT_DIR) $(DUT_DIR)/Main_Processor.v \
9+
+incdir+$(DUT_DIR) $(DUT_DIR)/Adder.v \
10+
+incdir+$(DUT_DIR) $(DUT_DIR)/adder_internal.v \
11+
+incdir+$(DUT_DIR) $(DUT_DIR)/ALU.v \
12+
+incdir+$(DUT_DIR) $(DUT_DIR)/black_box.v \
13+
+incdir+$(DUT_DIR) $(DUT_DIR)/comp.v \
14+
+incdir+$(DUT_DIR) $(DUT_DIR)/Control_Unit.v \
15+
+incdir+$(DUT_DIR) $(DUT_DIR)/data_mem.v \
16+
+incdir+$(DUT_DIR) $(DUT_DIR)/full_adder.v \
17+
+incdir+$(DUT_DIR) $(DUT_DIR)/grey_box.v \
18+
+incdir+$(DUT_DIR) $(DUT_DIR)/halfadder.v \
19+
+incdir+$(DUT_DIR) $(DUT_DIR)/Hazard_ControlUnit.v \
20+
+incdir+$(DUT_DIR) $(DUT_DIR)/inst_mem.v \
21+
+incdir+$(DUT_DIR) $(DUT_DIR)/mux2_1_1bit.v \
22+
+incdir+$(DUT_DIR) $(DUT_DIR)/mux4_1_16bit.v \
23+
+incdir+$(DUT_DIR) $(DUT_DIR)/reg_file.v \
24+
+incdir+$(DUT_DIR) $(DUT_DIR)/wallace_8bit.v
25+
DUT_TEST = \
26+
+incdir+$(DUT_DIR) $(DUT_DIR)/stg_final.v
27+
TEST_SOURCES = \
28+
+incdir+$(TEST_DIR) $(TEST_DIR)/top.sv \
29+
+incdir+$(TEST_DIR) $(TEST_DIR)/processor_interface.sv
30+
31+
all: comp runnurg
32+
33+
comp:
34+
$(VCS) -cm line+cond+fsm -Mupdate +v2k -sverilog -timescale=1ps/1ps $(DUT_SOURCES) $(TEST_SOURCES) -l compile.log +vcs+dupvars+verilog.vpd -debug_all
35+
run:
36+
$(SIMV) -cm line+cond+fsm +ntb_random_seed=$(SEED) +UVM_TESTNAME=$(TEST_NAME)
37+
runnurg: run
38+
urg -dir simv.vdb
39+
runncheck: run
40+
$(CHECK)
41+

Code/Processor/ALU.v

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer:
5+
//
6+
// Create Date: 17:48:12 02/12/2015
7+
// Design Name:
8+
// Module Name: ALU
9+
// Project Name:
10+
// Target Devices:
11+
// Tool versions:
12+
// Description:
13+
//
14+
// Dependencies:
15+
//
16+
// Revision:
17+
// Revision 0.01 - File Created
18+
// Additional Comments:
19+
//
20+
//////////////////////////////////////////////////////////////////////////////////
21+
module ALU(
22+
input [15:0]a,
23+
input [15:0]b,
24+
input [1:0]alu_sel, //use of alu_sel
25+
input [1:0]s, // 4 bits
26+
input sel,
27+
input [1:0]mul,
28+
output [15:0]y,
29+
output cout
30+
);
31+
wire [15:0]ar1,ar2,l1,l2,l3,l4,l5,l6,l7,l8,sh1,sh2,sh3,w1,w2,mul1;
32+
33+
wire k_mov=alu_sel[1]&~alu_sel[0]&~s[1]&s[0]; //For move;
34+
35+
//Arithmetic
36+
37+
assign ar1=((~({16{s[0]}}))&b)|((({16{s[0]}})^({16{s[1]}}))&~b)&({16{~k_mov}});
38+
Adder a1(a,ar1,(s[0]&(~k_mov)),ar2,cout);
39+
40+
//Logical
41+
assign l1=a&b;
42+
assign l2=a|b;
43+
assign l3=a^b;
44+
assign l4=a;
45+
mux2_1_1bit m1[15:0](l1,l2,s[0],l5);
46+
mux2_1_1bit m2[15:0](l3,l4,s[0],l6);
47+
mux2_1_1bit m3[15:0](l5,l6,s[1],l7);
48+
assign l8=l7^({16{sel}});
49+
50+
//Mulitplication
51+
wire[7:0] wmul1,wmul2,wmul11,wmul22;
52+
mux2_1_1bit mmul1[7:0](a[7:0],a[15:8],~mul[0],wmul1);
53+
mux2_1_1bit mmul2[7:0](b[7:0],b[15:8],~mul[0],wmul2);
54+
mux2_1_1bit mmul3[7:0]({8{1'b0}},wmul1,mul[0]|mul[1],wmul11);
55+
mux2_1_1bit mmul4[7:0]({8{1'b0}},wmul2,mul[0]|mul[1],wmul22);
56+
wallace_8bit m4(wmul11,wmul22,mul1);
57+
58+
//Shifter
59+
assign sh1=a<<b;
60+
assign sh2=a>>b;
61+
mux2_1_1bit m5[15:0](sh1,sh2,sel,sh3);
62+
63+
//Final Mux_logic
64+
mux2_1_1bit m6[15:0](ar2,l8,alu_sel[0],w1);
65+
mux2_1_1bit m7[15:0](mul1,sh3,alu_sel[0],w2);
66+
mux2_1_1bit m8[15:0](w1,w2,alu_sel[1]&(~k_mov),y);
67+
68+
endmodule

Code/Processor/Adder.v

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer:
5+
//
6+
// Create Date:
7+
// Design Name:
8+
// Module Name: Adder
9+
// Project Name:
10+
// Target Devices:
11+
// Tool versions:
12+
// Description:
13+
//
14+
// Dependencies:
15+
//
16+
// Revision:
17+
// Revision 0.01 - File Created
18+
// Additional Comments:
19+
//
20+
//////////////////////////////////////////////////////////////////////////////////
21+
module Adder(
22+
input [15:0] a,
23+
input [15:0] b,
24+
input cin,
25+
output [15:0] s,
26+
output cout
27+
);
28+
29+
wire [15:0]g,p,GG;
30+
31+
//Bitwise Generate And Propogate Signals.
32+
assign g=a&b;
33+
assign p=a^b;
34+
35+
36+
//Group Generate And Propogate Signals.
37+
assign GG[0]=g[0]|(p[0]&cin);
38+
black_box b1(g[15],p[15],g[14],p[14],g1,p1);
39+
black_box b2(g[14],p[14],g[13],p[13],g2,p2);
40+
black_box b3(g[13],p[13],g[12],p[12],g3,p3);
41+
black_box b4(g[12],p[12],g[11],p[11],g4,p4);
42+
black_box b5(g[11],p[11],g[10],p[10],g5,p5);
43+
black_box b6(g[10],p[10],g[9],p[9],g6,p6);
44+
black_box b7(g[9],p[9],g[8],p[8],g7,p7);
45+
black_box b8(g[8],p[8],g[7],p[7],g8,p8);
46+
black_box b9(g[7],p[7],g[6],p[6],g9,p9);
47+
black_box b10(g[6],p[6],g[5],p[5],g10,p10);
48+
black_box b11(g[5],p[5],g[4],p[4],g11,p11);
49+
black_box b12(g[4],p[4],g[3],p[3],g12,p12);
50+
black_box b13(g[3],p[3],g[2],p[2],g13,p13);
51+
black_box b14(g[2],p[2],g[1],p[1],g14,p14);
52+
gray_box gb1(g[1],p[1],GG[0],GG[1]);
53+
54+
black_box b15(g1,p1,g3,p3,g15,p15);
55+
black_box b16(g2,p2,g4,p4,g16,p16);
56+
black_box b17(g3,p3,g5,p5,g17,p17);
57+
black_box b18(g4,p4,g6,p6,g18,p18);
58+
black_box b19(g5,p5,g7,p7,g19,p19);
59+
black_box b20(g6,p6,g8,p8,g20,p20);
60+
black_box b21(g7,p7,g9,p9,g21,p21);
61+
black_box b22(g8,p8,g10,p10,g22,p22);
62+
black_box b23(g9,p9,g11,p11,g23,p23);
63+
black_box b24(g10,p10,g12,p12,g24,p24);
64+
black_box b25(g11,p11,g13,p13,g25,p25);
65+
black_box b26(g12,p12,g14,p14,g26,p26);
66+
gray_box gb3(g13,p13,GG[1],GG[3]);
67+
gray_box gb2(g14,p14,GG[0],GG[2]);
68+
69+
black_box b27(g15,p15,g19,p19,g27,p27);
70+
black_box b28(g16,p16,g20,p20,g28,p28);
71+
black_box b29(g17,p17,g21,p21,g29,p29);
72+
black_box b30(g18,p18,g22,p22,g30,p30);
73+
black_box b31(g19,p19,g23,p23,g31,p31);
74+
black_box b32(g20,p20,g24,p24,g32,p32);
75+
black_box b33(g21,p21,g25,p25,g33,p33);
76+
black_box b34(g22,p22,g26,p26,g34,p34);
77+
gray_box gb7(g23,p23,GG[3],GG[7]);
78+
gray_box gb6(g24,p24,GG[2],GG[6]);
79+
gray_box gb5(g25,p25,GG[1],GG[5]);
80+
gray_box gb4(g26,p26,GG[0],GG[4]);
81+
82+
gray_box gb15(g27,p27,GG[7],GG[15]);
83+
gray_box gb14(g28,p28,GG[6],GG[14]);
84+
gray_box gb13(g29,p29,GG[5],GG[13]);
85+
gray_box gb12(g30,p30,GG[4],GG[12]);
86+
gray_box gb11(g31,p31,GG[3],GG[11]);
87+
gray_box gb10(g32,p32,GG[2],GG[10]);
88+
gray_box gb9(g33,p33,GG[1],GG[9]);
89+
gray_box gb8(g34,p34,GG[0],GG[8]);
90+
91+
92+
//Final Sum And Cout.
93+
assign s[0]=p[0]^cin;
94+
assign s[1]=p[1]^GG[0];
95+
assign s[2]=p[2]^GG[1];
96+
assign s[3]=p[3]^GG[2];
97+
assign s[4]=p[4]^GG[3];
98+
assign s[5]=p[5]^GG[4];
99+
assign s[6]=p[6]^GG[5];
100+
assign s[7]=p[7]^GG[6];
101+
assign s[8]=p[8]^GG[7];
102+
assign s[9]=p[9]^GG[8];
103+
assign s[10]=p[10]^GG[9];
104+
assign s[11]=p[11]^GG[10];
105+
assign s[12]=p[12]^GG[11];
106+
assign s[13]=p[13]^GG[12];
107+
assign s[14]=p[14]^GG[13];
108+
assign s[15]=p[15]^GG[14];
109+
assign cout=GG[15];
110+
111+
112+
endmodule
113+

Code/Processor/Control_Unit.v

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
`timescale 1ns / 1ps
2+
//////////////////////////////////////////////////////////////////////////////////
3+
// Company:
4+
// Engineer:
5+
//
6+
// Create Date: 23:26:49 02/02/2015
7+
// Design Name:
8+
// Module Name: Control_Unit
9+
// Project Name:
10+
// Target Devices:
11+
// Tool versions:
12+
// Description:
13+
//
14+
// Dependencies:
15+
//
16+
// Revision:
17+
// Revision 0.01 - File Created
18+
// Additional Comments:
19+
//
20+
//////////////////////////////////////////////////////////////////////////////////
21+
module Control_Unit(
22+
input [3:0]op,
23+
input ctrl,
24+
input [1:0]re_config,
25+
output jmp,eop,ctrl_sel,mem_wr,wr_bk_sel,
26+
output [1:0]reg_wr,
27+
output [3:0]alu_sel,
28+
output [1:0]dir_val
29+
);
30+
31+
wire w1,w2,w3,w4,k,shiftv;
32+
33+
//Regwr
34+
assign w1=(op[3]&~op[2]&op[1]&op[0]); //store
35+
assign w2=(op[3]&op[2]&~op[1]&op[0]); //jump
36+
assign w3=(op[3]&op[2]&op[1]&~op[0]); //NOP
37+
assign w4=(op[3]&op[2]&op[1]&op[0]); //EOP
38+
assign k=w1|w2|w3|w4;
39+
40+
assign shiftv=re_config[1]&re_config[0]&op[3]&op[2]&~op[1]&~op[0];
41+
assign reg_wr[1]=(re_config[1]|(op[3]&~op[2]&~op[1]&~op[0])|shiftv)&(~k);
42+
assign reg_wr[0]=(re_config[0]|(op[3]&~op[2]&~op[1]&~op[0])|shiftv)&(~k);
43+
//Memwr
44+
assign mem_wr=w1;
45+
46+
//Write Back Select
47+
assign wr_bk_sel=(op[3]&~op[2]&op[1]&~op[0]);
48+
49+
//Dual select in ALU
50+
assign ctrl_sel=ctrl&~w3;
51+
52+
//Jump
53+
assign jmp=(op[3]&op[2]&~op[1]&op[0]);
54+
55+
//EOP
56+
assign eop=(op[3]&op[2]&op[1]&op[0]);
57+
58+
//Direct Value
59+
assign dir_val[1]=op[3]&~op[2]&~op[1]&op[0]&ctrl;
60+
assign dir_val[0]=op[3]&op[2]&~op[1]&~op[0];
61+
62+
//ALU select
63+
assign alu_sel=(op&{4{~w3}})|({~op[3],op[2],op[1],~op[0]}&{4{w3}});
64+
65+
endmodule
66+

0 commit comments

Comments
 (0)