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