2014-10-19 156 views
-2

我有以下Verilog代码。当我创建一个测试台来测试它时,reg ACC在整个波形中的值为X.我相信这是因为它没有正确实例化,我试图将其添加到自身中。我怎样才能做到这一点?我不想在always @块中将其设置为0,因为我希望它的值可以继续传递,除非我手动重置它。我已经使用初始开始块,但导致寄存器全部为Z.在Verilog中实例化

`timescale 1ns/1ps 

module AccAdder_Behavioral(IN, ADD, CLC, CLB, IAC, X2, ACC, CARRY 
); 
input[3:0] IN; 
input ADD, CLC, CLB, IAC; 
wire [3:0] SEL; 
input X2; 
output reg [3:0] ACC; 
output reg CARRY; 




always @(SEL) begin 

case(SEL) 
1: ACC = ACC + 4'b0001; //IAC 
    2: CARRY = CARRY & 0; //CLC 
    4: begin 
     ACC = ACC & 4'b0000; 
     CARRY = CARRY & 0; 
     end //CLB 
    8: ACC = ACC + IN;//ADD 
endcase 

end 


endmodule 
+1

您想让ACC成为触发器还是组合? – Morgan 2014-10-20 07:51:09

+0

您正在向自己添加ACC。它的初始值是X,因此将它加到它本身导致值保持在x。你为什么不使用带复位信号的if语句?重置为1时,将ACC设置为已知值。 – Ari 2014-10-20 17:58:55

回答

1

你需要一个时钟参考,如果您递增信号的值。否则,你正在推断复杂的锁存逻辑。时钟示例:

always @(posedge CLK) begin 
    case(1'b1) 
    IAC: ACC <= ACC + 4'b1; 
    CLC: CARRY <= 1'b0; 
    CLB: begin 
      ACC <= 4'b0; 
      CARRY <= 1'b0; 
     end 
    ADD: ACC <= ACC + IN; 
    endcase 
end