Skip to content

Chisel生成的verilog没有数组的解决方法 #18

@ColsonZhang

Description

@ColsonZhang

问题描述

由于chisel导出的verilog没有数组,所以chisel导出的verilog代码可能无法直接用于difftest仿真。
例如,直接用verilog描述的信号为:

Output [7:0] test [3:0];

使用chisel的描述语句为

val test = Vec(4, UInt(8.W))

将该代码生成verilog,声明的端口自动会转换为

...
output [7:0] test_0,
output [7:0] test_1,
output [7:0] test_2,
output [7:0] test_3,
...

解决方法

最简单的解决方法是直接在生成的Verilog中对不符合接口规范的语句进行替换。
这是我用Python创建的修改脚本replace.py
其中的几个变量str_tobe_replace_1 str_tobe_replace_2 str_tobe_replace_3需要根据你的实际代码进行一定的修改。

# 源文件路径(默认导出的文件覆盖原文件)
file_path   =   "./generated/oscpu2/SimTop.v"


str_tobe_replace_1  =   '''  output [63:0] io_memAXI_0_w_bits_data_0,
  output [63:0] io_memAXI_0_w_bits_data_1,
  output [63:0] io_memAXI_0_w_bits_data_2,
  output [63:0] io_memAXI_0_w_bits_data_3,'''

str_new_1   =   '''  output [63:0] io_memAXI_0_w_bits_data [3:0], // !!! generated by python'''

str_tobe_replace_2  =   '''  input  [63:0] io_memAXI_0_r_bits_data_0,
  input  [63:0] io_memAXI_0_r_bits_data_1,
  input  [63:0] io_memAXI_0_r_bits_data_2,
  input  [63:0] io_memAXI_0_r_bits_data_3,'''
str_new_2   =   '''  input [63:0] io_memAXI_0_r_bits_data [3:0], // !!! generated by python'''

str_tobe_replace_3  =   '''  wire [63:0] axi_mem_io_mem_data_read; '''

str_new_3   =   '''  wire [63:0] axi_mem_io_mem_data_read; 

  wire [63:0] io_memAXI_0_w_bits_data_0;
  wire [63:0] io_memAXI_0_w_bits_data_1;
  wire [63:0] io_memAXI_0_w_bits_data_2;
  wire [63:0] io_memAXI_0_w_bits_data_3;
  assign io_memAXI_0_w_bits_data[0] = io_memAXI_0_w_bits_data_0 ;
  assign io_memAXI_0_w_bits_data[1] = io_memAXI_0_w_bits_data_1 ;
  assign io_memAXI_0_w_bits_data[2] = io_memAXI_0_w_bits_data_2 ;
  assign io_memAXI_0_w_bits_data[3] = io_memAXI_0_w_bits_data_3 ;

  wire  [63:0] io_memAXI_0_r_bits_data_0;
  wire  [63:0] io_memAXI_0_r_bits_data_1;
  wire  [63:0] io_memAXI_0_r_bits_data_2;
  wire  [63:0] io_memAXI_0_r_bits_data_3;
  assign io_memAXI_0_r_bits_data_0  = io_memAXI_0_r_bits_data[0];
  assign io_memAXI_0_r_bits_data_1  = io_memAXI_0_r_bits_data[1];
  assign io_memAXI_0_r_bits_data_2  = io_memAXI_0_r_bits_data[2];
  assign io_memAXI_0_r_bits_data_3  = io_memAXI_0_r_bits_data[3];
  '''


file_content = ""
with open(file_path, "r") as f:
    file_content = f.read()

file_content = file_content.replace(str_tobe_replace_1, str_new_1)
file_content = file_content.replace(str_tobe_replace_2, str_new_2)
file_content = file_content.replace(str_tobe_replace_3, str_new_3)

with open(file_path, "w+") as f:
    f.write(file_content)

同时为了方便将处理好的verilog源文件复制到进行difftest的仿真路径,可以使用下面的shell脚本,一键编译verilog和修改源码(需要根据实际目录修改一些路径)

sbt "test:runMain oscpu2.verilog_TopMain_oscpu2"
python replace.py
sed -i '1i\`timescale 1ns / 10ps' ./generated/oscpu2/SimTop.v
cp ./generated/oscpu2/SimTop.v ../projects/czcpu_axi_diff/vsrc/SimTop.v

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions