2015-04-02 141 views
-1
module ocircuit (ooutp,s0,s1 ,clk,write,raddA,raddB,wadd,wdata); 
    output [3:0] ooutp; 
    input clk, write,s0,s1; 
    input [2:0] raddA; 
    input [2:0] wadd; 
    input [2:0] raddB; 
    input [3:0] wdata; 

    reg [9:0] ooutp; 
    wire [3:0] dataA; 
    wire [3:0] dataB; 
    reg [9:0] inner; 

    regfile y (dataA,dataB,clk,write,raddA,raddB,wadd,wdata); 
    always @(posedge clk) begin 
    if (s0==0) begin 
     assign inner = dataA [3:0]*dataB [3:0]; 
    end 
    else begin 
     assign inner = ((dataA [3:0]*dataB [3:0])+inner [9:0]); 
    end 
    //inner=inner1; 
    ooutp =s1?inner [9:0]:10'd0; 
    end 
endmodule 

這是代碼。 regfile是一個簡單的寄存器文件。在測試臺中,s0 = 0在第一個週期和s0 = 1Verilog邏輯錯誤

對於後續週期,此代碼應通過使用一個加法器和一個乘法器返回值A*B+C*D。在第一個週期中,當c0 = 0時,保存在inner(一個寄存器)中的答案是正確的,但在第二個週期中,當c0 = 1答案錯誤時。

POR例如:A=1; B=2; C=1; D=1; 第一週期:x=A*B=2 第二個週期(C*D)+x=5

我覺得有什麼不對這個說法

assign inner = ((dataA [3:0]*dataB [3:0])+inner [9:0]); 

任何幫助或提示將不勝感激。

+0

什麼是'A','B','C',和'D'?在你的代碼中只有'dataA'和'dataB'。 – mkrieger1 2015-04-02 14:41:31

+0

regfile是一個寄存器文件,因此對於第一個週期A = dataA和B = dataB,對於第二個週期,因爲我更改地址C = dataA和D = detaB。如果這部分難以理解,我應該發佈整個代碼,即(測試平臺,ocircui和regfile) – 2015-04-02 14:44:53

回答

0

儘管可以在always塊內使用賦值,但我認爲您只是想根據s0的值將值存儲到inner中。爲此,請使用非阻塞賦值(<=)。你

此外,您還可以直接輸出到ooutp而不是保存在inner最終結果,避免了多路複用器的可能故障實例這裏:

ooutp =s1?inner [9:0]:10'd0; 

其中,順便說一下,它應該是外always塊,在assign行:

assign ooutp = s1? inner [9:0]:10'd0; 

module ocircuit (ooutp,s0,s1 ,clk,write,raddA,raddB,wadd,wdata); 
    output [3:0] ooutp; 
    input clk, write,s0,s1; 
    input [2:0] raddA; 
    input [2:0] wadd; 
    input [2:0] raddB; 
    input [3:0] wdata; 

    reg [9:0] ooutp; 
    wire [3:0] dataA; 
    wire [3:0] dataB; 
    reg [9:0] inner; 

    regfile y (dataA,dataB,clk,write,raddA,raddB,wadd,wdata); 
    always @(posedge clk) begin 
    if (s0==0) begin 
     inner <= dataA [3:0]*dataB [3:0]; 
    end 
    else begin 
     ooutp <= ((dataA [3:0]*dataB [3:0])+inner [9:0]); 
    end 
    end 
endmodule 
+0

Thank you inner <=((dataA [3:0] * dataB [3:0])+ inner [9:0 ]); 這個說法對不對? – 2015-04-02 15:06:28

+0

在'always @(posedge clk)'裏面,是的。 – 2015-04-02 15:11:22

+0

我嘗試了你現在所說的'內部'註冊全部是'x',你能想到一個原因嗎? – 2015-04-02 15:34:48