今天自己在使用verilog mode的过程中,遇到两个信号需要屏蔽掉auto output的功能,中间遇到了一些问题,作下记录。
在 verilog-mode
工具中,如果你想同时忽略两个输出(比如含有 avgsnr
和 cursnr
的自动生成的 output),可以利用正则表达式的过滤功能,通过配置 verilog-mode
的 auto output 生成规则来达到这个目的。
具体步骤如下:
1. 修改 verilog-auto
的输出规则
verilog-mode
中,verilog-auto
负责自动生成信号声明。如果你希望忽略特定信号的输出,可以在 verilog-mode
的配置中通过正则表达式或者手动调整自动生成的代码。
2. 通过 verilog-auto-output-ignore-regexp
进行过滤
在 verilog-mode
中,你可以设置 verilog-auto-output-ignore-regexp
这个变量,指定要忽略的输出信号。这个正则表达式会匹配并忽略那些自动生成的 output。
假设你希望忽略含有 avgsnr
和 cursnr
的输出,可以通过以下步骤实现:
配置 verilog-auto-output-ignore-regexp
:
-
打开
~/.emacs
或者~/.emacs.d/init.el
(或者直接在gvim
的:Emacs
模式下配置)。 -
添加以下配置:
(setq verilog-auto-output-ignore-regexp "\\(avgsnr\\|cqi_1x1\\)")
\\( ... \\| ... \\)
是正则表达式中的“或”运算符,表示忽略avgsnr
或cursnr
的输出。- 这段代码设置了一个正则表达式,自动忽略所有与
avgsnr
或cursnr
匹配的 output。
-
保存配置并重新加载
verilog-mode
。
3. 如何使用
每次你使用 verilog-mode
的 verilog-auto
功能时,它会自动根据你的设置忽略输出信号中包含 avgsnr
和 cursnr
的项。
4. 手动编辑(如果需要)
如果你想手动控制哪些 output
被忽略,也可以直接在 Verilog 文件中注释掉自动生成的 output 声明,或者在 AUTOOUTPUT
块中移除不需要的信号。
总结
通过设置 verilog-auto-output-ignore-regexp
,你可以在 verilog-mode
中自动忽略含有 avgsnr
和 cursnr
的 output
。正则表达式将控制这些输出在自动生成时被跳过。
需要两个"\"的原因
在很多编程语言和工具(比如 Emacs、Verilog-mode)中,两个反斜杠 (\\
) 是用来转义特殊字符的。这里的 \\
实际上代表一个单一的反斜杠 (\
)。
原因解析:
-
反斜杠是转义字符:
反斜杠\
是正则表达式和编程语言中的转义字符,它用于表示特殊含义的符号。例如,\(
表示左括号(
在正则表达式中有特殊意义(表示分组)。 -
编程语言中的转义机制:
在某些编程语言(如 Python、Emacs Lisp)中,反斜杠\
也被用作字符串转义符。例如,如果你在字符串中写\n
,它代表换行符,而不是字面意义上的两个字符\
和n
。因此,如果你想在这些语言中使用字面上的反斜杠
\
,需要使用两个反斜杠\\
来进行转义。这样,编译器或解释器在处理时会将两个反斜杠识别为一个实际的反斜杠。
在正则表达式中的双反斜杠:
-
\(
和\)
:在正则表达式中表示分组,但在编程语言或工具的字符串中,必须写作\\(
和\\)
,因为第一个反斜杠是对第二个反斜杠的转义,实际传递给正则表达式引擎的还是\(
和\)
。 -
\|
:表示“或”逻辑,同样的道理,在需要转义反斜杠的语言或工具中,你必须写成\\|
来表示实际的\|
。
举个例子:
假设你在 Emacs
中使用正则表达式搜索,你想匹配分组和“或”逻辑,比如 (avgsnr|cursnr)
。因为 Emacs 的正则表达式中 ()
和 |
有特殊含义,你必须用 \(
来表示分组,用 \|
来表示“或”。
但是,在 Emacs 的 Lisp 配置中,你需要写作:
"\\(avgsnr\\|cqi_1x1\\)"
在这个例子中:
\\(
是实际的正则表达式中的\(
,表示分组。\\|
是正则表达式中的\|
,表示“或”。\\)
是正则表达式中的\)
,表示分组结束。