2014-12-07 2 views
0

msb가 1이면 값의 2의 보수를 수행하는 모듈을 만들려고합니다. 종지에서 작동하지만 합성하려고하면 다음 오류가 발생합니다.Verilog 코드를 합성 할 때 오류가 발생했습니다.

변수 표현식이 아니거나 잘못된 극성이므로 변수 X_parallel을 테스트 할 수 없습니다.

module xTwosComp (X_parallel, Clk, Reset, X_pos); 
input [13:0] X_parallel; 
input Clk, Reset; 
//wire X_msb; //was an attempt at fixing the problem 
output [13:0] X_pos; 
reg [13:0] X_pos; 

//assign X_msb=X_parallel[13];//failled attempt at fixing 

always @ (posedge Clk or posedge Reset) 
begin 
     if (X_parallel[13]) begin 
      X_pos = ~(X_parallel) +1; 
     end else begin 
      X_pos = X_parallel; 
     end 
end 

endmodule 

답변

1

당신은 당신의 리셋 문을 누락 다음과 같이

모듈의 코드입니다. 이것이 정확한 오류를 해결할 지 확신 할 수 없지만 신시사이저는 둘 이상의 에지 이벤트가있을 때 어떤 이벤트가 비동기식인지를 코드가 예상합니다.

if (X_parallel[13]) 앞에 if (Reset) begin X_pos <= 14'b0; else이 필요합니다. 그렇지 않으면 posedge Reset은 비동기 리셋이 아닌 다른 클록으로 처리됩니다. 이것은 신디사이저를 혼란스럽게 할 것입니다.

참고 : 플롭은 논 블로킹 지정 (<=)으로 지정되어야합니다. 잘못된 레이스 컨디션과 RTL을 게이트 시뮬레이션 불일치로 디버깅하지 않아도됩니다.

0

수많은 시간이 지나면 알아 냈습니다. Clk이나 Reset을 항상 블록으로 참조하지 않았기 때문입니다.

문제를 고려한 사람 덕분입니다.

답변을 주신 Greg에게 감사드립니다. 작동 방법을 찾았음에도 불구하고 현재 답변이 만족스럽지 않으므로 답변 해 주셔서 대단히 감사합니다. 감사!

관련 문제