我正在設計一個其2個操作數由兩個寄存器驅動的ALU。我設計了ALU並註冊爲不同的模塊。我沒有得到如何整合這些模塊並在行爲模型中創建verilog代碼。verilog代碼爲alu帶2個寄存器驅動的操作數
請提出一些想法來幫助我開始。
我正在設計一個其2個操作數由兩個寄存器驅動的ALU。我設計了ALU並註冊爲不同的模塊。我沒有得到如何整合這些模塊並在行爲模型中創建verilog代碼。verilog代碼爲alu帶2個寄存器驅動的操作數
請提出一些想法來幫助我開始。
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
可以看到哪些功能ALU確實這發生在case語句的操作碼控制。
我不太清楚「寄存器模塊」是什麼意思,因爲寄存器默認在Verilog中實現。您可以使用A和B的初始化作爲如何創建寄存器的示例。
因此,然後使用這個,你將不得不有一個測試臺模塊。
TESTBENCH 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
我用這個代碼的一類,它爲我工作。我願意回答您對此有關的問題,但我對verilog不太瞭解。我學到的所有東西都來自Google搜索。
如果您將多個模塊鏈接在一起,那麼您只需在測試臺中創建中間寄存器或連線。然後,您只需將它們與testbench代碼中顯示的方式進行鏈接即可。你將它們作爲參數傳遞給模塊的初始化。
'OUT <= OUT;'行會推斷一些複雜的異步鎖存。 'OUT <= A;'或'OUT <= 0;'或其他確定的分配會更好。另外,在組合塊中使用非阻塞和「分配」通常被認爲是不好的做法。 – Greg
請分享一些示例代碼來說明您正面臨的問題 –