前言

经常写Verilog的朋友都知道,Verilog的非阻塞赋值符号是 < = 。但是对于大部分开启了连字的等宽字体,这样子写后,会显示为<=而非<=。显然,前者的显示方法是错误的。如何显示为后者呢?

OpenType字体:随心所欲自定义

微软和 Adobe 在 1996 年开发了 OpenType 字体格式,基于 TrueType 和 PostScript 的技术,旨在提供更强大的功能。最重要的一点,便是支持连字、替代字形、上下标、旧式数字等高级排版特性。此外,为了不同场合下自定义,OpenType 字体包含了许多可开启的特性。

我使用Maple Mono Normal NF CN作为系统与博客的等宽字体,因其对中文十分友好。查看文档可知,在v7.1版本加入了cv63特性,即替代<=为箭头样式。因此,只需手动指定某一语言下的样式即可。

VSCode自定义

我曾经试过在VSCode的配置中搜索@lang:verilog,以确保设置应用于Verilog语言,但是好像字体修改部分并不会生效。没办法,只能修改工作区配置了。

在工作区配置的settings.json中加上:

1
"editor.fontLigatures": "'calt', 'cv63'",

即可确保Verilog下非阻塞赋值正常显示。

博客修改字体

博客的代码字体显示是由CSS样式表控制的。查看网页源代码可知,层级如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<figure class="highlight verilog">
<table>
<tbody>
<tr>
<td class="code">
<pre>
// ......
</pre>
</td>
</tr>
</tbody>
</table>
</figure>

因此需要确保classhighlight verilog的情况下覆盖<pre>标签的样式。手动加一个样式表,将选择器写具体以提升优先级:

1
2
3
#article-container figure.highlight.verilog td.code pre {
font-feature-settings: "calt" 1, "cv01" 1, "cv61" 1, "cv63" 1 !important;
}

即可在Verilog语言下正常显示非阻塞赋值。

测试

测试一下!

1
2
3
4
5
6
7
8
9
10
11
12
// Verilog
module dff (
input wire clk,
input wire d,
output reg q
);

always @(posedge clk) begin
q <= d; // 我是箭头!
end // <=========>

endmodule
1
2
3
## Python
if a <= b: ## 我不是箭头,但可以是!
print(a, b) ## <=========>