我遇到了一個綜合性問題,如果我在if語句中有兩個變量,綜合將會失敗(帶有誤導性和無用的錯誤消息)。Verilog綜合失敗,如果包含兩個變量的語句
下面給出
case(state)
//other states here
GET_PAYLOAD_DATA:
begin
if (packet_size < payload_length) begin
packet_size <= packet_size + 1;
//Code to place byte into ram that only triggers with a toggle flag
next_state = GET_PAYLOAD_DATA;
end else begin
next_state = GET_CHKSUM2;
end
end
我合成過程中得到的賽靈思ISE錯誤代碼片段:
ERROR:Xst:2001 - Width mismatch detected on comparator next_state_cmp_lt0000/ALB. Operand A and B do not have the same size.
錯誤聲稱next_state是不正確的,但如果我拿出payload_length
併爲其分配一個靜態值,它工作得很好。由於packet_size和payload_length都是整型,所以它們的大小相同,這不是問題。因此,我認爲它與循環不能在硬件中實現類似的問題,除非它是一個具有已定義結束的靜態循環。但是,如果語句應該工作,因爲它只是2個二進制值之間的比較器。
我在這裏試圖做的是當我的模塊接收到一個字節時,它將被添加到RAM中,直到達到整個有效負載的大小(我從早期的分組數據中獲得),然後改變到另一個狀態來處理校驗和。由於數據一次只能進入1個字節,因此我會多次調用該狀態,直到計數器達到極限,然後將下一個狀態設置爲其他值。
那麼我的問題是,我如何獲得調用我的狀態的同樣結果並重復,直到計數器達到有效負載的長度而不出現錯誤?
編輯:的 片段PACKET_SIZE和payload_length如何聲明,如在意見要求
integer payload_length, packet_size;
initial begin
//other stuff
packet_size <= 0;
end
always @ (posedge clk) begin
//case statements with various states
GET_PAYLOAD_LEN:
begin
if (rx_toggle == 1) begin
packet_size <= packet_size + 1;
addr <= 3;
din <= rx_byte_buffer;
payload_length <= rx_byte_buffer;
next_state = GET_PAYLOAD_DATA;
end else begin
next_state = GET_PAYLOAD_LEN;
end
end
rx_byte_buffer
是我的模塊接收作爲寬度爲8位的輸入數據的寄存器,而packet_size
增量在各您在上面看到的那臺機器的其他狀態。
我通過切換if語句的條件來解決錯誤,但仍然想明白爲什麼會改變任何東西。
'state'和'next_state'的位範圍是多少? 'GET_PAYLOAD_DATA'和'GET_CHKSUM2'的值是什麼? – Greg
狀態和next_state是4位(reg [3:0]狀態,next_state),並且GET_PAYLOAD_DATA和GET_CHKSUM2是分別被指定爲4'd5和4'd7的參數。 – fysloc
假設你正在使用一個組合塊和一個單獨的塊來分配觸發器,那麼'packet_size <= packet_size + 1;'應該是'next_packet_size = packet_size + 1;'保持阻塞是一個好習慣('=' )和非阻塞('<=')賦值在總是單獨的塊中。清理它,讓我們知道這是否有幫助。 – Greg