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 = 1
。Verilog邏輯錯誤
對於後續週期,此代碼應通過使用一個加法器和一個乘法器返回值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]);
任何幫助或提示將不勝感激。
什麼是'A','B','C',和'D'?在你的代碼中只有'dataA'和'dataB'。 – mkrieger1 2015-04-02 14:41:31
regfile是一個寄存器文件,因此對於第一個週期A = dataA和B = dataB,對於第二個週期,因爲我更改地址C = dataA和D = detaB。如果這部分難以理解,我應該發佈整個代碼,即(測試平臺,ocircui和regfile) – 2015-04-02 14:44:53