2015-04-02 148 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