Я обновил код, чтобы сделать его модульным .. и добавлена картинка с подписанными модульными именами
`timescale 1ns / 1ps
module two_digit_BCDAdder(
input clk,
input [7:0] X,
input Load,
output [8:0] R
);
reg [7:0] Q = 0;
// 8 bit register
always @(posedge clk)begin
if (Load) Q <= #10 X;
else Q <= #10 Q;
end
wire [3:0] AM,AL,BL,BM;
wire [3:0] sum_PA1,sum_PA2,sum_PA3,sum_PA4;
wire cin_PA1,cin_PA2,cin_PA3,cin_PA4;
wire cout_PA1,cout_PA2,cout_PA3,cout_PA4;
wire or_gate1_out,or_gate2_out,or_gate3_out,or_gate4_out;
wire c1_ag9,c2_ag9;
assign AL = Q[3:0] ;
assign AM = Q[7:4] ;
assign BL = X[3:0] ;
assign BM = X[7:4] ;
adder PA1(
.a (AM)
,.b (BM)
,.c_in (or_gate3_out)
,.sum (sum_PA1)
,.c_out (cout_PA1)
);
adder PA2(
.a (AL)
,.b (BL)
,.c_in (1'b0)
,.sum (sum_PA2)
,.c_out (cout_PA2)
);
adder PA3(
.a ({1'b0,{2{or_gate1_out}},1'b0})
,.b (sum_PA1)
,.c_in (1'b0)
,.sum (sum_PA3)
,.c_out (cout_PA3)
);
adder PA4(
.a ({1'b0,{2{or_gate4_out}},1'b0})
,.b (sum_PA2)
,.c_in (1'b0)
,.sum (sum_PA4)
,.c_out (cout_PA4)
);
comp C1(
.a (sum_PA1)
,.ag9 (c1_ag9)
);
comp C2(
.a (sum_PA2)
,.ag9 (c2_ag9)
);
or_gate or_gate1 (
.a (cout_PA1)
,.b (c1_ag9)
,.out (or_gate1_out)
);
or_gate or_gate2 (
.a (or_gate1_out)
,.b (cout_PA3)
,.out (or_gate2_out)
);
or_gate or_gate3 (
.a (cout_PA2)
,.b (cout_PA4)
,.out (or_gate3_out)
);
or_gate or_gate4 (
.a (c2_ag9)
,.b (cout_PA2)
,.out (or_gate4_out)
);
assign R[3:0] = sum_PA4;
assign R[7:4] = sum_PA3;
assign R[8] = or_gate2_out;
endmodule
module adder (input [3:0] a,b,
input c_in,
output [3:0] sum,
output c_out
);
assign {c_out,sum} = a+b+c_in;
endmodule
module comp (input [3:0] a,
output ag9
);
assign ag9 = a > 4'h9;
endmodule
module or_gate(input a,b,
output out
);
assign out = a||b;
endmodule
и новый файл tb с именованными подключениями портов к dut
`timescale 1ns / 1ps
module BCD_sim();
reg [7:0]x;
reg b;
reg clk;
wire[8:0]r;
two_digit_BCDAdder dut(
.clk (clk)
,.X (x)
,.Load (b)
,.R (r)
);
initial
begin
clk =0;
forever #1 clk=~clk;
end
initial
begin
x=0; b=0;
//Values for test
#2 x=55; b=1;
#2 x=55; b=0;
#4;
#2 x=99; b=1;
#2 x=99; b=0;
#4;
#2 x=87; b=1;
#2 x=78; b=0;
#4;
#2 x=25; b=1;
#2 x=75; b=0;
#4;
#2 x=33; b=1;
#2 x=66; b=0;
#4;
#2 x=69; b=1;
#2 x=96; b=0;
$finish;
end
endmodule
с указанными выше файлами симулятор vivdo показывает результаты ..
простой код вместо модульного
module two_digit_BCDAdder(
input clk,
input [7:0] X,
input Load,
output [8:0] R
);
reg [7:0] Q = 0;
// 8 bit register
always @(posedge clk)begin
if (Load) Q <= #10 X;
else Q <= #10 Q;
end
wire [3:0] AM,AL,BL,BM;
wire [3:0] sum_PA1,sum_PA2,sum_PA3,sum_PA4;
wire cin_PA1,cin_PA2,cin_PA3,cin_PA4;
wire cout_PA1,cout_PA2,cout_PA3,cout_PA4;
wire or_gate1_out,or_gate2_out,or_gate3_out,or_gate4_out;
wire c1_ag9,c2_ag9;
assign AL = Q[3:0] ;
assign AM = Q[7:4] ;
assign BL = X[3:0] ;
assign BM = X[7:4] ;
//4 Adders
assign {cout_PA1,sum_PA1} = AM[3:0] + BM[3:0] + or_gate3_out;
assign {cout_PA2,sum_PA2} = AL[3:0] + BL[3:0] + 1'b0 ;
assign {cout_PA3,sum_PA3} = sum_PA1[3:0] + {1'b0,{2{or_gate1_out}},1'b0} + 1'b0;
assign {cout_PA4,sum_PA4} = sum_PA2[3:0] + {1'b0,{2{or_gate4_out}},1'b0} + 1'b0;
// 2 Comparators
assign c1_ag9 = sum_PA1 > 4'h9 ;
assign c2_ag9 = sum_PA2 > 4'h9 ;
// 4 OR gates
assign or_gate1_out = cout_PA1 || c1_ag9 ;
assign or_gate2_out = or_gate1_out || cout_PA3 ;
assign or_gate3_out = cout_PA2 || cout_PA4 ;
assign or_gate4_out = cout_PA2 || c2_ag9 ;
// Assigning outputs
assign R[3:0] = sum_PA4;
assign R[7:4] = sum_PA3;
assign R[8] = or_gate2_out;
endmodule