u@home:~$

  • 装Quartus Lite 20.1, 在Windows WSL

    电脑坏了真烦。 在Windows WSL下没法运行32-bit程序,所以quartus最少也得20.1版本。 装完运行quartus,先设置路径。 ~/.bashrc export PATH=$PATH:~/intelFPGA_lite/20.1/quartus/bin export PATH=$PATH:~/intelFPGA_lite/20.1/modelsim_ase/bin 有几个lib没有。 sudo apt-get install -y libsm6 libxext6 libxrender-dev Then the following errors showed up. warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory realloc(): invalid pointer Aborted (core dumped) To solve the first warning, run: sudo dpkg-reconfigure locales...

  • 替换chiplab里的axi-sram-bridge

    前两天自己搞了个最简单的axi-sram-bridge,只支持单次的读写,准备替换chiplab里的IP/AXI_SRAM_BRIDGE/soc_axi_sram_bridge.v chiplab代码里默认定义的是AXI64,也就是数据是64位宽,地址宽都是还是32。 试了下把数据宽改为32,出错了,这个错也可能是因为之前把TLB拿掉,改了不少地方,现在不好确定了。 所以还是用64的。 把自己的axi_sram_bridge替换上去,结果取指没取到。 结果发现是数据在下降沿到了,比rvalid晚了半个cycle。 可能是verilator里testbench模拟的时候搞错了?先试试把chiplab里的模拟delay的AXI_DELAY_RAND去掉。 这个模拟读内存delay的模块之前也没搞清楚怎么用,每次delay没变化。 奇怪的事。 soc_axi_sram_bridge.v文件如果在IP/AXI_SRAM_BRIDGE/目录下,虽然在makefile里看,是会被编译,但并没有用到。 可这个文件在的话,不但编译了,还加到工程里了。比如随便一搜,有好多。 ../run_func/obj_dir/Vsimu_top___024root__39.cpp: vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_data_push ../run_func/obj_dir/Vsimu_top___024root__39.cpp: = ((IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_push) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: & ((IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_pop) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: | (~ (IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_valid)))); ../run_func/obj_dir/Vsimu_top___024root__39.cpp: vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_queue_push ../run_func/obj_dir/Vsimu_top___024root__39.cpp: = ((((IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_push) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: & (IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_valid)) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: & (~ (IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_pop))) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: & (~ (IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_r_a_queue_valid))); ../run_func/obj_dir/Vsimu_top___024root__39.cpp: vlSelf->soc_axi_sram_bridge__DOT__ram_w_a_queue_pop ../run_func/obj_dir/Vsimu_top___024root__39.cpp: = ((IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_w_a_pop) ../run_func/obj_dir/Vsimu_top___024root__39.cpp: & (IData)(vlSelf->soc_axi_sram_bridge__DOT__ram_w_a_queue_valid)); ../run_func/obj_dir/Vsimu_top___024root__39.cpp: vlSelf->soc_axi_sram_bridge__DOT__ram_w_a_data_push ../run_func/obj_dir/Vsimu_top___024root__39.cpp:...

  • 经常用的信号开关的两个问题,1.dff得加上reset 2.结束信号来得太早,比开始信号还早

    100 wire rdata_valid_next; 101 102 assign rdata_valid_next = (rdata_valid | ar_enter) & (~m_rready); 103 104 dff_s #(1) rdata_valid_reg ( 105 .din (rdata_valid_next), 106 .clk (aclk), 107 .q (rdata_valid), 108 .se(), .si(), .so()); 这里有个问题,如果ar_enter如果不为1,或者m_rready没有为1过,这时候rdata_valid是x。 所以这段代码在刚reset以后,rdata_valid可能会有一段x的时候。 所以这个dff得用带reset的。 100 wire rdata_valid_next; 101 102 assign rdata_valid_next = (rdata_valid | ar_enter) & (~m_rready); 103 104...