当我输入这样的内容时:
always @* begin
case(SW[17])
1'b0: assign LEDG = SW[7:0];
1'b1: assign LEDG = SW[15:8];
endcase
end
其中LEDG设置为[7:0]绿色LED,我收到错误:
错误(10137):Verilog HDL程序分配错误 part2.v(20):object" LEDG"在任务的左侧必须有一个 可变数据类型
试图编译。但是,当我在case块之外放置一个类似的赋值语句时,例如:
assign LEDG = SW[7:0];
它分配得很好。我似乎无法弄清楚这个问题。
(如果解决方案很明显,我很抱歉,我对Verilog来说很新。)
答案 0 :(得分:1)
我的猜测是你宣布LEDG为
wire [7:0] LEDG;
将其更改为
reg [7:0] rLEDG;
wire [7:0] LEDG;
assign LEDG = rLEDG;
您的始终阻止现在应该分配rLEDG。
基本上,总是块不能分配给电线,只能注册。另一方面,分配语句,分配给不是regs的电线。
答案 1 :(得分:0)
分配语句不能在always块中使用。删除'分配'从线路改变你的输出[7:0] LEDG'阵列到'输出reg [7:0] LEDG' 。必须在always块内使用reg数据类型。
答案 2 :(得分:0)
使用类似的分配,你很可能没有做到你期望的。有关您目前正在做的事情的说明,请参阅using-a-continous-assignment-in-a-verilog-procedure。
要在DJZygotes答案中进行扩展,对于wire
或assign
块中的分配,LEDG必须为reg
always
或initial
。
wire [7:0] LEDG;
assign LEDG = SW[7:0];
或者:
reg [7:0] LEDG;
always @* begin
case(SW[17])
1'b0: LEDG = SW[7:0];
1'b1: LEDG = SW[15:8];
endcase
end