LSFR을 구현하는 아래의 작은 Verilog 프로젝트가 있습니다. 현재 자일링스 ISE 14.6에서는 코드가 올바르게 컴파일되지 않는다. 그것과 함께 오류가 발생했습니다 :부품 선택 Verilog에서 잘못된 lvalue 발생
오류 : HDLCompilers : 108 - "top.v"줄 70 스칼라 와이어 어레이 'q'의 부품 선택이 올바르지 않습니다. 오류 : HDLCompilers : 107 - "top.v"줄 70 불법적 인 권리 nonblocking assignment의 손 사이드 오류 : HDLCompilers : 108 - "top.v"라인 74 스칼라 와이어 어레이 'q'의 부품 선택이 올바르지 않습니다. 오류 : HDLCompilers : 107 - "top.v"라인 74 불법적 인 오른쪽의 내 코드에서이 시점에서 가리키는 블로킹 할당
는 :
always @ (display) begin
if(display == 1'b0) begin
LSB <= q[3:0];
switch <= LSB;
end
else begin
MSB <= q[7:4];
switch <= MSB;
end
end
나는에 오류를 보았다 Xilinx 사용자 가이드는이 문제를 해결하기 위해 2 비트보다 큰 비트 폭을 지정했지만 이미 8 비트이므로 어떤 문제가 있는지 확실하지 않습니다. 도움이된다면
은 여기 내 전체 상위 모듈의 :
`timescale 1ns/1ps
module top (c, start, clk_in, display, segments);
input [7:0] c;
input start, clk_in;
output [3:0] display;
output [6:0] segments;
reg [6:0] segments;
reg [3:0] display;
reg [3:0] LSB;
reg [3:0] MSB;
wire q[7:0];
wire q_[7:0];
wire clk, dff0_w, dff1_w, dff2_w, dff3_w, dff4_w, dff5_w, dff6_w;
reg [3:0] switch;
initial begin
display <= 4'b0111;
end
clock_divider #(15) divider(.cin(clk_in), .cout(clk));
//switch changes back and forth between the MSB and LSB of the 8 bit number when muxing
decoder bits(clk, switch, segments);
//D adders
dff dff0(.D(dff0_w),.Q(q[0]),.clk(clk),.start(start));
dff dff1(q[0],q[1],clk,start);
dff dff2(q[1],q[2],clk,start);
dff dff3(q[2],q[3],clk,start);
dff dff4(q[3],q[4],clk,start);
dff dff5(q[4],q[5],clk,start);
dff dff6(q[5],q[6],clk,start);
dff dff7(q[6],q[7],clk,start);
//xor gates
xor (dff6_w, q[7], q_[6]);
xor (dff5_w, dff6_w, q_[5]);
xor (dff4_w, dff5_w, q_[4]);
xor (dff3_w, dff4_w, q_[3]);
xor (dff2_w, dff3_w, q_[2]);
xor (dff1_w, dff2_w, q_[1]);
xor (dff0_w, dff1_w, q_[0]);
//buffer the C values
assign q_[0] = c[0] ? 1'b0 : q[0];
assign q_[1] = c[1] ? 1'b0 : q[1];
assign q_[2] = c[2] ? 1'b0 : q[2];
assign q_[3] = c[3] ? 1'b0 : q[3];
assign q_[4] = c[4] ? 1'b0 : q[4];
assign q_[5] = c[5] ? 1'b0 : q[5];
assign q_[6] = c[6] ? 1'b0 : q[6];
assign q_[7] = 1 ? 1'b0 : q[7]; //Cn is always 1
//mux the display
always @ (posedge clk) begin
if(display == 4'b0111)
display <= 4'b1011;
else
display <= 4'b0111;
end
//display the appropriate value when the anode is asserted
always @ (display) begin
if(display == 1'b0) begin
LSB <= q[3:0];
switch <= LSB;
end
else begin
MSB <= q[7:4];
switch <= MSB;
end
end
endmodule
RTL 시뮬레이션과 게이트 레벨 (합성 후) 결과가 일치하지 않을 수 있으므로'always @ (display) '를'always @ *'로 바꾸는 것이 불완전한 민감도 목록이기 때문에 생각해야합니다. – Morgan