使用emacs来编写verilog/systemverilog 交流一下

有使用emacs来写verilog/systemverilog的吗? 进来一起交流下~

来了,好像针对硬件开发的完整环境配置较少(比如集成的verilog-snippet 等 )

我之前用vim,后来感觉emacs功能更强大点,最近上手感觉没法真正用起来,更多的还是当一个原始编辑器再用,希望能跟你们学习下~PS:我主要在windows下,虚拟机跑了一个ubuntu,不过也是刚开始

我一直没把sv 的lsp用起来,现在用的citre 没法精准跳转和查引用,写代码还是差点意思 :joy:

1 个赞

还在摸索使用emacs verilog mode的auto用法。。

sv的lsp我都试了一遍,的确一个能用的都没,我混合citre和tabnine一起用了一段时间,最后索性都关了,直接用consult搜索,hide show折叠代码,consult-imenu 大范围跳转,习惯了也还好😄

我是小白,请问citre该怎么配置呀,可否分享下配置呢

我用hide show 抄子坛友的配置把 hs-special-modes-alist 中的verilog-mode 相关的配成了 (verilog-mode “\<begin\>\|\<task\>\|\<function\>\|\<class\>\|\<module\>\|\<package\>\|(” “\<end\>\|\<endtask\>\|\<endfunction\>\|\<endclass\>\|\<endmodule\>\|\<endpackage\>\|)” nil verilog-forward-sexp-function) 发现在某些 如果在一个package 里面执行+fold/close-all 会把整个package 折叠起来, 其实我只是想把task function begin 这些块折叠, 于是我把 hs-special-modes-alist 配成了 (verilog-mode “\<begin\>\|\<task\>\|\<function\>\|(” “\<end\>\|\<endtask\>\|\<endfunction\>\|)” nil verilog-forward-sexp-function) 发现在含有package class 的文件中执行 +fold/close-all 会卡死, 如果把 hs-special-modes-alist 中的括号配置项去掉就不会, 不知道你遇到过这种情况没有? 不加括号又折叠不了实例, 我现在的做法是 advice +fold/close-all 在执行这个函数前去根据光标上下两行的内容来动态的改变hs-special-modes-alist 但是这种办法还是不完美

    (require 'citre-config)
    (setq citre-use-project-root-when-creating-tags t
             citre-prompt-language-for-ctags-command t
             citre-auto-enable-citre-mode-modes '(prog-mode)
             )

citre 不需要特殊配置, 这样就行, 然后把这些function 找个键位绑定

   '("e c a" . citre-ace-peek)
   '(citre-jump)
   '(citre-peek)
   '(citre-jump-back)
   '(citre-update-this-tags-file)
   '(citre-peek-restore)
   '(citre-peek-save-session)
   '(citre-peek-load-session)

你试试这样. 其他的关键词也是类似的写发就行. 能折叠各种 block , 也可以嵌套折叠

    (add-to-list 'hs-special-modes-alist '(verilog-mode "\\(\\<begin\\>\\|\\<case\\>\\|\\<module\\>\\|\\<class\\>\\|\\<function\\>\\|\\<task\\>\\)"
                                                        "\\(\\<end\\>\\|\\<endcase\\>\\|\\<endmodule\\>\\|\\<endclass\\>\\|\\<endfunction\\>\\|\\<endtask\\>\\)" nil verilog-forward-sexp-function))

如果你是evil 用户的话, 可以用这样类似的键位

                            '("z a" . hs-toggle-hiding) ;; toggle block
                            '("z c" . hs-hide-block)
                            '("z o" . hs-show-block)
                            '("z m" . hs-hide-all) ;; hide all blocks in current buffer
                            '("z r" . hs-show-all) ;; expand all blocks in current buffer

Peek 2022-05-21 15-50

折叠的我也能用,我碰到的问题是在有package class 的文件中,折叠关键字不包含package 和 module 和 class 的时候,按zm全部折叠就会卡死,原因就是折叠关键字中包含了括号,把括号去掉即不折叠实例就不会卡死 :joy:

有杨例代码吗,我调试一下试试

citre 配置可以参考这篇, https://skfwe.cn/post/citre_verilog/ 里面把你的ctags 这些可执行文件改成你自己的,再把里面一堆你没有对应函数的按键绑定的删掉就行了, 配置里简单hack了一下citre 的jump函数,使得跳转后光标定位到关键词上

package cfg_pkg;
import uvm_pkg::*;
`include "uvm_macros.svh"

typedef enum {WR,RD,IDLE}cmd_t;

class cfg_item extends uvm_sequence_item;    // trasaction

    constraint cstr {
    }

    `uvm_object_utils_begin (cfg_item)
        `uvm_field_int(rw, UVM_ALL_ON)
        `uvm_field_int(addr, UVM_ALL_ON)
        `uvm_field_sarray_int(data, UVM_ALL_ON)
        `uvm_field_int(data_len, UVM_ALL_ON)
    `uvm_object_utils_end

    function new (string name = "cfg_item");
        super.new(name);
    endfunction
endclass : cfg_item

endpackage

zm 之后会卡死

hs-special-modes-alist 使用如下配置

(map-put hs-special-modes-alist 'verilog-mode '("\\<begin\\>\\|\\<task\\>\\|\\<function\\>\\|(" "\\<end\\>\\|\\<endtask\\>\\|\\<endfunction\\>\\|)" nil verilog-forward-sexp-function))

问题出在

    `uvm_object_utils_begin (cfg_item)

这一句, 把这句注释掉就可以正常折叠了。。。

Peek 2022-05-21 17-30

我用了 hide-all, 很流畅…

你的配置不是我的配置呀 你的都把class折叠了, 你的配置里面肯定没有 “(” “)” 这一对

哦哦, 我用的我自己的配置, 没细看. 这个() 是用来折叠实例名或参数么

对比了一下你的代码和我的, 我没把握到你这样的目的, 不好意思爱莫能助了

是的 , 类似这种

demo dut (
          .abc(abc),
          .abc(abc),
          .abc(abc)
) ;

...(...) 这种就会导致折叠失败, 把、删掉就行了, 我现在的做法是 zm 之前检查buffer 如果存在可能导致折叠失败的文本则把括号去掉, 否则就保留折叠实例的功能

嗯嗯,原来如此,hide我不怎么懂,等一个大佬来看看

好的, 没事, 代码折叠我其实用得不多,现在这样也够用了 :joy: