ALU CODE
module alu(opcode, A, B, OUT, Z, N);
input [3:0]opcode;
input [31:0]A;
input [31:0]B;
output reg [31:0]OUT;
output reg Z;
output reg N;
always @(opcode or A or B)
begin
case(opcode)
4'b0001: OUT <= A+B;
4'b0111: OUT <= A+(-B);
4'b0101: OUT <= A+1;
4'b0110: OUT <=~A;
default: OUT <= OUT;
endcase
if(OUT == 0)
begin
assign Z = 1;
assign N = 0;
end
else
begin
assign Z = 0;
if(OUT < 0)
assign N = 1;
else
assign N = 0;
end
end
initial begin
OUT = 0;
Z = 0;
N = 0;
end
endmodule
Sie die Opcode-Steuerelemente sehen können, die die ALU tut Funktion, die in dem Fall Aussage geschieht.
Ich weiß nicht genau, was Sie unter "Module für die Register" verstehen, da Register standardmäßig in Verilog implementiert sind. Sie können die Initialisierung von A und B als Beispiele für die Erstellung von Registern verwenden.
Also, um dies zu verwenden, müssten Sie ein Testbench-Modul haben.
Prüfstand CODE
module alu_testbench();
reg [31:0] A, B;
reg [3:0] opcode;
wire Z, N;
wire [31:0]OUT;
alu #() DUT (
.A(A),
.B(B),
.opcode(opcode),
.OUT(OUT),
.Z(Z),
.N(N)
);
initial begin
A = 5;
B = 2;
opcode = 4'b0001;
#10 // 7
A = 3;
#10 // 5
B = 3;
#10 // 6
A = 0;
opcode = 4'b0110;
#10 // FFFFFFFFFFFFFF
A = 5;
B = 2;
opcode = 4'b0111;
#10 // 3
opcode = 4'b0101;
#10 // 6
$finish;
end
endmodule
habe ich diesen Code für eine Klasse und es funktionierte für mich. Ich bin bereit, Ihre Fragen zu beantworten, aber ich weiß nicht viel über Verilog. Alles, was ich gelernt habe, war von Google-Suchen.
Wenn Sie mehrere Module miteinander verbinden, erstellen Sie nur Zwischenregs oder Drähte in Ihrem Testbench. Dann verknüpfen Sie sie einfach mit der Art und Weise, die im Testbench-Code angezeigt wird. Sie übergeben sie als Argumente für die Initialisierung des Moduls.
Bitte teilen Sie einige Beispielcode, um das Problem zu veranschaulichen –