Verilog - 比特流在硬件上工作,但模拟不编译
Verilog - bitstream works on hardware but simulation doesn't compile
我正在使用 Verilog 设置 FPGA,使其每秒闪烁一次 LED。这是一种方法:
`default_nettype none
module pps(i_clk, o_led);
parameter CLOCK_RATE_HZ = 12_000_000;
input wire i_clk;
output wire o_led;
reg [23:0] counter;
initial counter = 0;
always @(posedge i_clk)
if (counter < CLOCK_RATE_HZ/2 - 1)
begin
counter <= counter + 1'b1;
end
else
begin
counter <= 0;
o_led <= !o_led;
end
endmodule
现在我写了这个 makefile:
file_v = pps
file_pcf = icebreaker
file_cpp = driver
module_top = pps
all:
yosys -p "synth_ice40 -top $(module_top) -blif $(file_v).blif" $(file_v).v
arachne-pnr -d 5k -P sg48 -o $(file_v).asc -p $(file_pcf).pcf $(file_v).blif
icepack $(file_v).asc $(file_v).bin
flash:
iceprog $(file_v).bin
simulate:
verilator --trace -Wall -cc $(file_v).v
make -C obj_dir -f V$(file_v).mk
g++ \
-I /usr/share/verilator/include/ \
-I obj_dir/ \
/usr/share/verilator/include/verilated.cpp \
/usr/share/verilator/include/verilated_vcd_c.cpp \
$(file_cpp).cpp \
obj_dir/V$(file_v)__ALL.a \
-o $(file_v).elf
./$(file_v).elf
gtkwave $(file_v).vcd
#################################################################################################
.PHONY: clean
clean:
@rm *.bin
@rm *.blif
@rm *.asc
@rm -r obj_dir
@rm *.elf
@rm *.vcd
前两个 makefile 目标 (all
& flash
) 工作完美,当比特流文件上传到开发板时,LED 以 1Hz 的频率闪烁。不错
但是,当我尝试模拟这个模块时,我 运行 makefile 目标 simulate
,我得到一个错误:
┌───┐
│ $ │ ziga > ziga--workstation > 003--pps
└─┬─┘ /dev/pts/13
└─> make simulate
verilator --trace -Wall -cc pps.v
%Error-PROCASSWIRE: pps.v:72: Procedural assignment to wire, perhaps intended var (IEEE 2017 6.5): o_led
%Error: Exiting due to 1 error(s)
%Error: See the manual and http://www.veripool.org/verilator for more assistance.
%Error: Co`
有人可以解释一下哪里出了问题吗?该设计已经在硬件上运行(!),那么为什么我的模拟不能编译?如何使这个示例也适用于模拟?
如您的错误消息所述,对 wire
进行程序分配是非法的。例如,程序分配是在 always
块内进行的分配。您将 o_led
声明为 wire
,但随后在 always
块中分配给它。您应该在 always
块中使用 reg
类型。请参阅 IEEE 标准 1800-2017,第 10.4 节 程序分配。
变化:
output wire o_led;
至:
output reg o_led;
wire
类型用于连续赋值,例如使用assign
关键字。
我正在使用 Verilog 设置 FPGA,使其每秒闪烁一次 LED。这是一种方法:
`default_nettype none
module pps(i_clk, o_led);
parameter CLOCK_RATE_HZ = 12_000_000;
input wire i_clk;
output wire o_led;
reg [23:0] counter;
initial counter = 0;
always @(posedge i_clk)
if (counter < CLOCK_RATE_HZ/2 - 1)
begin
counter <= counter + 1'b1;
end
else
begin
counter <= 0;
o_led <= !o_led;
end
endmodule
现在我写了这个 makefile:
file_v = pps
file_pcf = icebreaker
file_cpp = driver
module_top = pps
all:
yosys -p "synth_ice40 -top $(module_top) -blif $(file_v).blif" $(file_v).v
arachne-pnr -d 5k -P sg48 -o $(file_v).asc -p $(file_pcf).pcf $(file_v).blif
icepack $(file_v).asc $(file_v).bin
flash:
iceprog $(file_v).bin
simulate:
verilator --trace -Wall -cc $(file_v).v
make -C obj_dir -f V$(file_v).mk
g++ \
-I /usr/share/verilator/include/ \
-I obj_dir/ \
/usr/share/verilator/include/verilated.cpp \
/usr/share/verilator/include/verilated_vcd_c.cpp \
$(file_cpp).cpp \
obj_dir/V$(file_v)__ALL.a \
-o $(file_v).elf
./$(file_v).elf
gtkwave $(file_v).vcd
#################################################################################################
.PHONY: clean
clean:
@rm *.bin
@rm *.blif
@rm *.asc
@rm -r obj_dir
@rm *.elf
@rm *.vcd
前两个 makefile 目标 (all
& flash
) 工作完美,当比特流文件上传到开发板时,LED 以 1Hz 的频率闪烁。不错
但是,当我尝试模拟这个模块时,我 运行 makefile 目标 simulate
,我得到一个错误:
┌───┐
│ $ │ ziga > ziga--workstation > 003--pps
└─┬─┘ /dev/pts/13
└─> make simulate
verilator --trace -Wall -cc pps.v
%Error-PROCASSWIRE: pps.v:72: Procedural assignment to wire, perhaps intended var (IEEE 2017 6.5): o_led
%Error: Exiting due to 1 error(s)
%Error: See the manual and http://www.veripool.org/verilator for more assistance.
%Error: Co`
有人可以解释一下哪里出了问题吗?该设计已经在硬件上运行(!),那么为什么我的模拟不能编译?如何使这个示例也适用于模拟?
如您的错误消息所述,对 wire
进行程序分配是非法的。例如,程序分配是在 always
块内进行的分配。您将 o_led
声明为 wire
,但随后在 always
块中分配给它。您应该在 always
块中使用 reg
类型。请参阅 IEEE 标准 1800-2017,第 10.4 节 程序分配。
变化:
output wire o_led;
至:
output reg o_led;
wire
类型用于连续赋值,例如使用assign
关键字。