1

我正在使用 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 target 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`

有人可以解释什么是错的吗?该设计已经在硬件上运行(!),那么为什么我的仿真不能编译呢?我如何让这个例子也适用于模拟?

4

1 回答 1

1

正如您的错误消息所述,对 a 进行程序分配是非法的wire。例如,程序分配是在always块内进行的分配。您声明o_led为 a wire,但随后您在一个always块中分配给它。您应该在块reg内使用类型。always请参阅 IEEE Std 1800-2017,第 10.4 节程序分配

改变:

output wire o_led;

到:

output reg o_led;

wire类型用于连续赋值,assign例如使用关键字。

于 2021-05-07T12:32:13.220 回答