背景

用chisel写电路代码的时候发现模块都分散在不同的文件里面,有时候很难看清楚模块连接关系,用vivado生成电路有太慢了,所以写了个可以把chisel生成的verilog(或者systemverilog)代码生成电路模块连接图的脚本

 

需要预安装的环境

1.fish shell环境,代码写在fish环境中,直接保存到~/.config/fish/function/文件夹底下,命名为gen_svg.fish就可以使用

2.yosys,一个开源的数字电路综合工具,用sudo apt install yosys就可以下载

3.sv2v,一个转换systemverilog到verilog的工具,因为yosys不支持systemverilog,所以要转换systemverilog为verilog

4.netlistsvg,配合yosys使用的工具,需要用sudo npm install -g netlistsvg安装

其他运行过程中缺失的环境请根据报错自行安装

5.xdg-open

 

代码内容

fish function的代码如下(如果不想用fish function请自行修改脚本)

function gen_svg --wraps='' --description 'make verilog into .svg graph with colorized wires'
    set verilog_file $argv[1]

    if test -z "$verilog_file"
        echo "用法: gen_svg your_file.v"
        return 1
    end
	if not test -f $verilog_file
		echo "文件不存在: $verilog_file"
		return 1
	end
	if string match -q '*.sv' $verilog_file
	     sv2v $verilog_file > (basename $verilog_file .sv).v
	     set verilog_file (basename $verilog_file .sv).v
	end
    

    set base_name (basename $verilog_file .v)
    set top_module $base_name
    set json_file $base_name.json
    set svg_file $base_name.svg

    for tool in yosys netlistsvg awk sed xdg-open
        if not type -q $tool
            echo "缺少工具: $tool"
            return 1
        end
    end

    # Step 1: 生成 JSON
    yosys -p "read_verilog $verilog_file; hierarchy -check -top $top_module; proc; opt; write_json $json_file"

    # Step 2: 生成 SVG
    netlistsvg $json_file -o $svg_file

    # Step 3: 添加白底
    if not grep -q '<rect width="100%" height="100%" fill="white"/>' $svg_file
        sed -i 's|<svg[^>]*>|&\n  <rect width="100%" height="100%" fill="white"/>|' $svg_file
    end

    # Step 4: 彩色路径着色
    awk '
    function randcolor() {
        r = int(rand() * 256)
        g = int(rand() * 256)
        b = int(rand() * 256)
        return sprintf("#%02x%02x%02x", r, g, b)
    }

    BEGIN {
        srand()
    }

    {
        if ($0 ~ /<(path|line|polyline)[^>]*>/) {
            if ($0 ~ /stroke="/) {
                sub(/stroke="[^"]*"/, "stroke=\"" randcolor() "\"")
            } else {
                sub(/<[^ >]+ /, "&stroke=\"" randcolor() "\" ")
            }
        }
        print
    }
    ' $svg_file > $svg_file.tmp && mv $svg_file.tmp $svg_file

    # Step 5: 打开 SVG
    xdg-open $svg_file &
end

复制这段代码到~/.config/fish/functions/文件夹下,命名为gen_svg.fish(名字可以自行修改)

 

之后执行gen_svg  your_verilog_name.v(或者.sv)就可以自动生成图片并且打开

 

有问题欢迎在评论区提出

 

 

 

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐