2017-08-07 20 views
-2

我正在設計一個其2個操作數由兩個寄存器驅動的ALU。我設計了ALU並註冊爲不同的模塊。我沒有得到如何整合這些模塊並在行爲模型中創建verilog代碼。verilog代碼爲alu帶2個寄存器驅動的操作數

請提出一些想法來幫助我開始。

+0

請分享一些示例代碼來說明您正面臨的問題 –

回答

0

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代碼中顯示的方式進行鏈接即可。你將它們作爲參數傳遞給模塊的初始化。

+1

'OUT <= OUT;'行會推斷一些複雜的異步鎖存。 'OUT <= A;'或'OUT <= 0;'或其他確定的分配會更好。另外,在組合塊中使用非阻塞和「分配」通常被認爲是不好的做法。 – Greg