Part-Select在verilog中导致非法左值

时间:2013-11-01 19:30:28

标签: verilog xilinx

我在下面有一个小的verilog项目实现了LSFR。目前,代码无法在Xilinx ISE 14.6中正确编译。它出错了:

错误:HDLC编译器:108 - “top.v”70行部分选择标量线阵'q'是非法的 错误:HDLC编译器:107 - “top.v”第70行非阻塞分配的非法右侧 错误:HDLC编译器:108 - “top.v”行74部分选择标量线阵'q'是非法的 错误:HDLC编译器: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

1 个答案:

答案 0 :(得分:2)

尝试更改:

wire q[7:0];
wire q_[7:0]; 

为:

wire [7:0] q;
wire [7:0] q_; 

这清除了我的编译错误。