Compilation error: A net is not a legal lvalue in this context

I am a newbie to Verilog and had a problem while defining a if-else loop. The error message is

A net is not a legal lvalue in this context" for all assign statements in the given code.

always @(adbar) if (adbar==1'b1) begin assign Z[0] = m_out[0]; assign Z[1] = m_out[1]; assign Z[2] = m_out[2]; assign Z[3] = X[5]; assign Z[4] = X[6]; assign Z[5] = X[7]; assign Z[6] = m_out[3]; assign Z[7] = m_out[4]; end else begin assign Z[0] = m_out[0]; assign Z[1] = m_out[1]; assign Z[2] = m_out[2]; assign Z[3] = X[3]; assign Z[4] = X[4]; assign Z[5] = X[5]; assign Z[6] = m_out[3]; assign Z[7] = m_out[4]; end endmodule 

The full program is given below. All the modules have been properly defined and I am sure that the error is only in this part.

 module my_decoder (X,adbar, clear, clock, Z); input [7:0] X; input adbar; input clear, clock; output [7:0] Z; wire clear, clock; wire [7:0] Z; wire [4:0] d_out; wire [4:0] x_out; wire [4:0] m_out; wire [4:0] n_out; wire sel1; wire c_out1; wire c_out2; wire c_out3; mux2_gate_1 \dut6[0].l4 (.in1 (x_out[0]), .in2 (n_out[0]), .sel (sel1), .o(m_out[0])); mux2_gate_2 \dut6[1].l4 (.in1 (x_out[1]), .in2 (n_out[1]), .sel (sel1), .o(m_out[1])); mux2_gate_3 \dut6[2].l4 (.in1 (x_out[2]), .in2 (n_out[2]), .sel (sel1), .o(m_out[2])); mux2_gate_4 \dut6[3].l4 (.in1 (x_out[3]), .in2 (n_out[3]), .sel (sel1), .o(m_out[3])); mux2_gate_5 \dut6[4].l4 (.in1 (x_out[4]), .in2 (n_out[4]), .sel (sel1), .o(m_out[4])); always @(adbar) if (adbar==1'b1) begin assign Z[0] = m_out[0]; assign Z[1] = m_out[1]; assign Z[2] = m_out[2]; assign Z[3] = X[5]; assign Z[4] = X[6]; assign Z[5] = X[7]; assign Z[6] = m_out[3]; assign Z[7] = m_out[4]; end else begin assign Z[0] = m_out[0]; assign Z[1] = m_out[1]; assign Z[2] = m_out[2]; assign Z[3] = X[3]; assign Z[4] = X[4]; assign Z[5] = X[5]; assign Z[6] = m_out[3]; assign Z[7] = m_out[4]; end endmodule 
1

1 Answer

In Verilog you can model combinational circuits using assign or always. You can't mix them together.

If you want to model using assign, you can replace your always-block with following construct:

assign Z = adbar ? {m_out[4:3], X[7:5], m_out[2:0]} : {m_out[4:3], X[5:3], m_out[2:0]}; 

If you want to model using always, remove assign keyword from assignments and change Z output type from wire to reg.

0

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like