2013-09-07 2 views
2

다음과 같은 Verilog 코드가 있습니다. 리셋 할 때 카운터의 값을 저장하는 것이 좋습니다. 그러나, 합성 수 있는지 확실하지 않습니다 (메모리가 동기 재설정 필요). DRC violatins가 생기고 메모리, bufreadaddr, bufreadval은 모두 최적화되어 있습니다. 이것을 쓰는 다른 방법은 무엇입니까?Verilog : 리셋이 발생할 때 카운터 값 저장

module counter (clk,reset, d_out,laststoredvalue, bufreadaddr, bufreadval, resetcount) ; 
input clk ,reset ; 
input [5:0] resetcount; 

output [15:0] d_out; 
output [15:0] laststoredvalue; 
input [5:0] bufreadaddr; 
output [15:0] bufreadval; 
reg [15:0] bufreadval; 

reg [15:0] laststoredvalue; 

reg [15:0] d_out; 
reg [15:0] d_out_mem[63:0]; 

always @(negedge reset or posedge clk) begin 
     if (reset == 0) begin 
      d_out <= 16'h0000; 
      d_out_mem[resetcount] <= d_out; 
      laststoredvalue <= d_out; 
     end else begin 
       d_out <= d_out + 1'b1; 
      end 
end 

always @(bufreadaddr) 
     bufreadval = d_out_mem[bufreadaddr]; 


integer count; 
initial begin 
    count = 0; 
end 
always @(posedge clk) begin 
    count = count + 1; 
    //$display(count); 
end 


endmodule 
+0

이 질문은 여기에서 참조되었습니다. https://danluu.com/why-hardware-development-is-hard/ –

답변

0

안녕하세요. 코드에 약간의 변경이있었습니다. 레지스터에 출력을 저장하는 임시 변수를 추가하여 재설정시 이전 값을 저장합니다.

module counter (clk,reset, d_out,laststoredvalue, bufreadaddr, bufreadval, resetcount) ; 
input clk ,reset ; 
input [5:0] resetcount; 

output [15:0] d_out; 
output [15:0] laststoredvalue; 
input [5:0] bufreadaddr; 
output [15:0] bufreadval; 
reg [15:0] bufreadval; 

reg [15:0] laststoredvalue; 
reg [15:0] temp; 
reg [15:0] d_out; 
reg [15:0] d_out_mem[63:0]; 

always @(negedge reset or posedge clk) begin 
     if (reset == 0) begin 

      d_out_mem[resetcount] = d_out; 
      laststoredvalue = temp; 
       d_out = #10 16'h0000; 
     end 
      else begin 

       d_out = d_out + 1'b1; 
        temp = d_out; 
      end 
end 

always @(bufreadaddr) 
     bufreadval = d_out_mem[bufreadaddr]; 

endmodule 

나머지 코드는 그대로입니다.