前言

作为重度Vscode依赖症患者,肯定啥都想拿Vscode写。这学期整了数字系统设计这门课写Verilog,于是折腾了一下三天配好环境。

配置

VScode部分

安装必要插件

安装好下列插件,即可享受最低限度的代码补全/高亮:

image-20240316211903839

对于格式化代码,需要按照自己喜好进行设置,在最后一个插件的设置内有相关项。推荐使用 Verible-verilog-formatter。自行去GitHub下载好二进制文件,设置path即可(或是在插件内手动指定路径)

Google Verible 参数文档

用法:verible-verilog-format [选项] <文件> [<文件...>] 要从stdin中传输,请使用'-'作为<文件>。

从common/formatting/basic_format_style_init.cc获取的标志:
--column_limit(格式化时要保持在其下的目标行长度限制。);默认值:100;
--indentation_spaces(每个缩进级别增加的空格数。);默认值:2;
--line_break_penalty(每引入一个换行符的解决方案添加的惩罚。);默认值:2;
--over_column_limit_penalty(为了最小化惩罚,这表示超出列限制的基准惩罚值。超出此限制的每个字符额外惩罚1。);默认值:100;
--wrap_spaces(每个wrap级别增加的空格数。这适用于在开放组节之后的第一个元素被包装时。否则,缩进级别设置为开放组运算符的列位置。);默认值:4;

从verilog/formatting/format_style_init.cc获取的标志:
--assignment_statement_alignment(格式化各种赋值:{align,flush-left,preserve,infer});默认值:infer;
--case_items_alignment(格式化case项:{align,flush-left,preserve,infer});默认值:infer;
--class_member_variable_alignment(格式化类成员变量:{align,flush-left,preserve,infer});默认值:infer;
--compact_indexing_and_selections(在索引/位选择运算符中使用紧凑的二进制表达式);默认值:true;
--distribution_items_alignment(Aligh分配项:{align,flush-left,preserve,infer});默认值:infer;
--enum_assignment_statement_alignment(使用枚举格式化赋值:{align,flush-left,preserve,infer});默认值:infer;
--expand_coverpoints(如果为true,始终展开coverpoints。);默认值:false;
--formal_parameters_alignment(格式化形式参数:{align,flush-left,preserve,infer});默认值:infer;
--formal_parameters_indentation(缩进形式参数:{indent,wrap});默认值:wrap;
--module_net_variable_alignment(格式化net/变量声明:{align,flush-left,preserve,infer});默认值:infer;
--named_parameter_alignment(格式化命名实际参数:{align,flush-left,preserve,infer});默认值:infer;
--named_parameter_indentation(缩进命名参数赋值:{indent,wrap}); 默认:wrap;
--named_port_alignment(格式化命名端口连接:{align,flush-left,preserve,infer}); 默认:infer;
--named_port_indentation(缩进命名端口连接:{indent,wrap}); 默认:wrap;
--port_declarations_alignment(格式化端口声明:{align,flush-left,preserve,infer}); 默认:infer;
--port_declarations_indentation(缩进端口声明:{indent,wrap}); 默认:wrap;
--port_declarations_right_align_packed_dimensions(如果为true,在启用对齐的上下文中,打包维度将右对齐。); 默认:false;
--port_declarations_right_align_unpacked_dimensions(如果为true,在启用对齐的上下文中,解包维度将右对齐。); 默认:false;
--struct_union_members_alignment(格式化结构/联合成员:{align,flush-left,preserve,infer}); 默认:infer;
--try_wrap_long_lines(如果为true,让格式化器尝试在需要换行的地方优化换行决策,否则保持未格式化。这是减少风险的短期措施。); 默认:false;
--wrap_end_else_clauses(将end和else关键字拆分为单独的行); 默认:false;

从verilog/tools/formatter/verilog_format.cc中的标志:
--failsafe_success(如果为true,即使存在输入错误或内部错误,也始终以0状态退出。在所有错误情况下,始终保留原始文本。这对于部署服务时应将故障安全行为视为成功很有用。); 默认:true;
--inplace(如果为true,在成功的条件下覆盖输入文件。); 默认:false;
--lines(要格式化的特定行,基于1,以逗号分隔,包括N-M范围,N是N-N的简写。默认情况下,未指定左边,所有行都启用格式化。 (可重复,累积); 默认:;
--max_search_states(限制线包装优化过程中探索的搜索状态数量。);
--show_equally_optimal_wrappings(如果为true,则打印找到多个最优解时的信息(stderr),但继续正常操作。);默认值:false;
--show_inter_token_info(如果为true,与show_token_partition_tree一起,包括诸如间隔和断行惩罚之类的词间信息。);默认值:false;
--show_largest_token_partitions(如果> 0,则打印标记分区,然后退出而不格式化输出。)默认值:0;
--show_token_partition_tree(如果为true,则在标记分区后打印诊断信息,然后退出而不格式化输出。)默认值:false;
--stdin_name(当使用'-'从stdin读取时,用于诊断目的的替代名称。否则会被忽略。);默认值:"<stdin>";
--verbose(更详细。)默认值:false;
--verify_convergence(如果为true,并且不是使用--lines逐增地格式化,则验证重新格式化的输出是否不再产生进一步的更改,即格式化是收敛的。)默认值:true;

我自用的格式化参数:

--indentation_spaces=4 
--line_break_penalty=3
--named_port_alignment=align
--port_declarations_alignment=align
--port_declarations_indentation=indent
--module_net_variable_alignment=align
--wrap_end_else_clauses=true
--named_parameter_indentation=wrap
--assignment_statement_alignment=align
--wrap_end_else_clauses=true
--try_wrap_long_lines=false
--column_limit=75
--named_parameter_alignment=align
--case_items_alignment=align
--enum_assignment_statement_alignment=align
--named_port_indentation=indent
--formal_parameters_alignment=align
--formal_parameters_indentation=indent

环境部分

配置IVerilog

iVerilog是一个用于硬件描述语言(HDL)Verilog 的开源仿真工具,小巧轻便跨平台,可以在多平台上使用。之所以不使用Xilinx的xvlog是因为太笨重了。当然你也可以试试

和上面Verible-verilog-formatter的配置方法一样,去Icarus Verilog for Windows下载安装包,安装时记得勾上Add to PATH就行。之后在插件内选择iVerilog为默认的语法解释器即可。但因为某些限制,无法做到实时检查错误,只能在每次保存完文件之后显示。