【EDA软件】【联合Modelsim仿真使用方法】

news2025/5/18 13:00:47

背景

业界EDA工具仿真功能是必备的,例如Vivado自带仿真工具,且无需联合外部仿真工具,例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim,才能实现仿真功能。

方法一:FUXI联合ModelSim

1 添加testbench文件

新建top_tb.v文件,可以新建一个sim文件夹,把tb文件保存在里面。

Porject Manager->Add Sources->Add or create simulation sources->Create File,创建top_tb.v,创建后界面如图1:

图1

2 编写仿真代码并保存

top.v只输出了led这个信号,所以仿真代码比较简单,如图1,top.v代码如下所示:

// ============================================================
//
// Company:
// Engineer:
//
// Create Date: 05/14/2025 10:43:05   
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
// ============================================================
module top #(
    parameter  ADDR_WIDTH   = 10     ,
    parameter  DATA_WIDTH   = 16
)(
    output  reg     led
);

localparam  DEPTH = (1 << ADDR_WIDTH);
localparam  CNT_THD = 11'd10;

wire                        inner_osc_clk               ; // 80MHZ
wire                        mcu_clk                     ;
wire                        fpga_clk                    ;
wire                        pll_locked                  ;
wire                        sys_rst_n                   ;
wire                        por_locked                  ;

wire                        clk                         ;
wire                        rst_n                       ;

wire                        we                          ;
wire    [ADDR_WIDTH-1:0]    addr                        ;
wire    [DATA_WIDTH-1:0]    d_data                      ;
wire    [DATA_WIDTH-1:0]    q_data                      ;


reg     [DATA_WIDTH-1:0]    memory      [DEPTH-1:0]     ;
reg     [DATA_WIDTH-1:0]    wr_data                     ;
reg     [DATA_WIDTH-1:0]    rd_data                     ;
reg     [ADDR_WIDTH-1:0]    wr_addr                     ;
reg     [ADDR_WIDTH-1:0]    rd_addr                     ;
wire                        wr_en                       ;
wire                        rd_en                       ;

reg     [10:0]              wr_cnt                      ;
reg     [10:0]              rd_cnt                      ;

reg                         we_1ff                      ;
reg                         rd_en_1ff                   ;


oscillator_v1 u_oscillator_v1(
    .clkout     (  inner_osc_clk    )
);

pll_v1 u_pll_v1(
    .clkin0     (   inner_osc_clk   ), // i
    .locked     (   pll_locked      ), // o
    .clkout0    (   fpga_clk        ), // o
    .clkout1    (                   )  // o
);

por_v1_1 u_por_v1_1(
    .O          (   por_locked      )
);

assign  sys_rst_n = pll_locked & por_locked;


assign  clk = fpga_clk;
assign  rst_n = sys_rst_n;

/*First Write*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        wr_cnt <= 11'd0;
    end
    else if (wr_cnt < CNT_THD) begin
        wr_cnt <= wr_cnt + 1'b1;
    end
    else;
end

/*Write Full, then Read*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        rd_cnt <= 11'd0;
    end
    else if (rd_en & (rd_cnt < CNT_THD)) begin
        rd_cnt <= rd_cnt + 1'b1;
    end
    else;
end

assign we = wr_cnt < CNT_THD ? 1'b1 : 1'b0;

assign  wr_en = (we & (wr_cnt < CNT_THD)) ? 1'b1 : 1'b0;
assign  rd_en = ((~we) & (rd_cnt < CNT_THD)) ? 1'b1 : 1'b0;

/*Memory Write Address Option*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        wr_addr <= {ADDR_WIDTH{1'b0}};
    end
    else if (wr_en) begin
        wr_addr <= wr_addr + 1'b1;
    end
    else;
end

/*Memory Read Address Option*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        rd_addr <= {ADDR_WIDTH{1'b0}};
    end
    else if (rd_en) begin
        rd_addr <= rd_addr + 1'b1;
    end
    else;
end


/*Set Write Data Value*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        wr_data <= {DATA_WIDTH{1'b0}};
    end
    else if (wr_en) begin
        wr_data <= wr_data + 1'b1;
    end
    else;
end

/*Memory Write Data Option*/
always @ (posedge clk or negedge rst_n) begin : MEM_WRITE
    integer i;
    if (!rst_n) begin
        for (i = 0; i < DEPTH; i = i + 1) begin
            memory[i] <= {DATA_WIDTH{1'b0}};
        end
    end
    else if (wr_en) begin
        memory[wr_addr] <= wr_data;
    end
    else;
end

/*Memory Read Data Option*/
always @ (posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        rd_data <= {DATA_WIDTH{1'b0}};
    end
    else if (rd_en) begin
        rd_data <= memory[rd_addr];
    end
    else;
end

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        we_1ff <= 1'b0;
        rd_en_1ff <= 1'b0;
    end
    else begin
        we_1ff <= we;
        rd_en_1ff <= rd_en;
    end
end

always @ (posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        led <= 1'b1;
    end
    else if (we) begin
        led <= 1'b0;
    end
    else if ((~we_1ff) & rd_en_1ff) begin
        if (&(rd_data ^~ q_data)) begin
            led <= 1'b1;
        end
        else begin
            led <= 1'b0;
        end
    end
end


assign d_data = wr_data;
assign addr = we ? wr_addr : rd_addr;
assign ce = ((wr_cnt < CNT_THD) || (rd_cnt < CNT_THD)) ? 1'b1 : 1'b0;

emb_v1 emb_v1_SP (
    .clk        (   clk             ),
    .rstn       (   rst_n           ),
    .ce         (   ce              ), // i
    .we         (   we              ), // i
    .a          (   addr            ), // i
    .d          (   d_data          ), // i
    .q          (   q_data          )  // o
);

endmodule

以上代码比较简单,通过寄存器搭建Memory,实现单端口RAM,以此验证单端口RAM IP。

3 设置仿真内容

3.1 设置Modelsim路径

Options->Simulation->ModelSim Path,路径为Modelsim的安装路径,一般为XXXX\Modelsim_10.5\win64;

3.2 设置Test Bench的Module name

Options->Simulation->ModelSim Path->Top Module Name of Test Bench,填写Module name;

3.3 设置Design Top的Module name

Options->Simulation->ModelSim Path->Instance Name of Design Top Module,填写Module name;

3.4 设置Test Bench Files

Options->Simulation->ModelSim Path->Test Bench Files,添加编写的仿真文件。

3.5 设置Modelsim *.do File

Options->Simulation->ModelSim Path->Modelsim *.do File,添加*.do文件。

暂时不好使,不推荐使用。

设置结果如图2:

图2

4 开始仿真

Flow->Simulation->RTL Simulation,最后点击RTL Simulation,如图3,开始仿真。

图3

自动会联合Modelsim工具,并弹出Modelsim的工具界面。

5 缺点

5.1 弹出界面后,需要手动进行run -all或者点击按钮,且没有固定的仿真时间,需要手动停止;

5.2 弹出界面只有top_tb的信号,需要手动自行添加信号,再运行;

5.3 修改文件需要从新执行4,比较浪费时间。

6 优点

FUXI可以很快的检查出文件的语法错误。

方法二:脚本构建 推荐

与top_tb.v同级目录下,添加三种文件,如图4:

图4

1 files.f 

添加需要编译仿真的testbench、 DUT(RTL)文件

内容如下:

top_tb.v
//rtl 仿真
D:/02_Fuxi/2025-03-28-win64-rel-99/data/lib/p0_sim.v
../src/ip/pll_v1.v
../src/ip/por_v1_1.v
../src/ip/oscillator_v1.v
../src/ip/emb_v1.v
../src/top.v

以上涉及1个问题,需要知道仿真模型;这个后续罗列出来。

2 start.do

汇总编译、波形设置的命令

#1 Create and Map the work lib
vlib work
vmap work work


#2  Now compile all the files
vlog -64 -sv +acc -incr +define+SIM -timescale 1ns/1ns -work work -f files.f -l rtl.log


#3  Start the simulator, log all waveforms, load wave file and run
vsim -voptargs="+acc" -sva +define+SIM -c work.top_tb -l sim.log -wlfdeleteonquit


#4 Set the window types
view wave
view structure
view signals


#5 Add signals or signals group to view wave
add wave -divider "System"
add wave -radix hexadecimal -group "System" top_tb/u_top/clk 
add wave -radix hexadecimal -group "System" top_tb/u_top/rst_n


add wave -divider "Memery Option"
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_wr_en
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_wr_addr
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_wr_data
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_rd_en
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_rd_addr
add wave -radix hexadecimal -group "Memery" top_tb/u_top/mem_rd_data


add wave -divider "EMB Option"
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_wr_en
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_wr_addr
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_wr_data
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_rd_en
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_rd_addr
add wave -radix hexadecimal -group "EMB" top_tb/u_top/emb_rd_data


add wave -radix hexadecimal top_tb/u_top/led 


#6 Set run Time
run 40ms

以上主要包含了6部分的设置。

3 批处理文件

如:run_sim.bat

echo pause  


::删除Modelsim生成的相关文件
RD work /s /q
DEL transcript vsim.wlf /q


vsim -do start.do 
pause

通过批处理文件,调用start.do进行仿真。

4 优点

4.1 文件修改后,只需要在Modelsim CLI界面执行do start.do;

4.2 编辑start.do,添加需要观察的信号,进行波形观察。

5 缺点

修改文件需要编译才能知道文件的语法有错误,这稍微一点好时间可以接受。

因此可以联合FUXI,通过检查语法,当无语法错误后,进行编译仿真。

举例:

下图是结合方法1和方法2的优点,对单端口RAM的仿真结果。

例子连接:待上传。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+

本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选&#xff0c;所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理&#xff0c;城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下&#xff1a; electoral…

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中&#xff0c;如果你想显示当前工作目录的路径&#xff0c;应该使用哪个命令&#xff1f;&#xff08;A&#xff09; A. pwd B. cd C. ls D. echo 解析&#xff1a;Linux 系统中&#xff0c;pwd命令可以显示当前工作目录的路径。pwd&#x…

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例&#xff0c;我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形&#xff1b;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂&#xff01;&#xff01;&#xff01;&#xff08;谢谢&#xff09; 神速熟悉面向对象 表格结构和类结构 我们在现实生活中&#xff0c;思考问题、发现问题、处理问题&#xff0c;往往都会用“表格”作为工具。实际上&#xff0c;“表格思维”就是…

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义&#xff1a; 知识蒸馏是一种模型压缩与迁移技术&#xff0c;通过将复杂高性能的教师模型&#xff08;Teacher Model&#xff09;所学的“知识”迁移到轻量级的学生模型&#xff08;Student Model&#xff09;&#xff0c;使学生模型在参数量和计…

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

【DAY21】 常见的降维算法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业&#xff1a; 什么时候用到降维 降维的主要应用场景 知识点回顾&#xff1a; PCA主成分分析t-sne降维LDA线性判别 通常情况下&#xff0c;…

校园社区小程序源码解析

基于ThinkPHP、FastAdmin和UniApp开发的校园社区小程序源码&#xff0c;旨在为校园内的学生和教职员工提供一个便捷的在线交流和服务平台。 该小程序前端采用UniApp进行开发&#xff0c;具有良好的跨平台兼容性&#xff0c;可以轻松发布到iOS和Android平台。同时&#xff0c;后…

第6章:文件权限

一、文件权限概述 Linux为了保证系统中每个文件的安全&#xff0c;引入了文件权限机制。针对于系统中的每一个文件Linux都可以提供精确的权限控制。它可以做到不同的用户对同一个文件具有不同的操作权利。而通常这个权利包括以下3个&#xff1a; 读的权利&#xff08;Read&…

C语言| 指针变量的定义

C语言| 指针的优点-CSDN博客 * 表示“指向”&#xff0c;为了说明指针变量和它所指向的变量之间的联系。 int * i&#xff1b;//表示指针变量i里面存放的地址&#xff0c;所指向的存储单元里的【数据】。 【指针变量的定义】 C语言规定所有变量&#xff0c;在使用前必须先定…

IntelliJ IDEA给Controller、Service、Mapper不同文件设置不同的文件头注释模板、Velocity模板引擎

通过在 IntelliJ IDEA 中的 “Includes” 部分添加多个文件头模板&#xff0c;并在 “Files” 模板中利用这些包含来实现不同类型文件的注释。以下是为 Controller、Service、Mapper 文件设置不同文件头的完整示例&#xff1a; 1. 设置 Includes 文件头模板 File > Settin…

【论文阅读】BEVFormer

〇、Introduction BEVFormer是现在端到端无人驾驶中常使用的一个Backbone&#xff0c;用于将六个视角下的图像转换为鸟瞰图视角下的特征&#xff0c;转换出的BEV特征则会被用于后续模块的特征交互。然而在这个模型设计的初期&#xff0c;其最本质的意图是为了提取用于各种CV任…

IDEA编辑器设置的导出导入

背景 最近新换了电脑&#xff0c;因为之前是 Intel 芯片的 Mac&#xff0c;这次换了 arm 架构的 M 芯片的 Mac&#xff0c;旧 Mac 上的很多软件不兼容&#xff0c;所以就没有选择换机数据迁移&#xff0c;一点一点下载、配置了所有环境。 导出 IDEA 支持设置的导入导出&…

成功案例丨从草图到鞍座:用先进的发泡成型仿真技术变革鞍座制造

案例简介 在鞍座制造中&#xff0c;聚氨酯泡沫成型工艺是关键环节&#xff0c;传统依赖实验测试的方法耗时且成本高昂。为解决这一问题&#xff0c;意大利自行车鞍座制造商 Selle Royal与Altair合作&#xff0c;采用Altair Inspire PolyFoam软件进行发泡成型仿真。 该工具帮助团…

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…

【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

Qt与Hid设备通信

什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是‌直接与人交互的电子设备‌&#xff0c;通过标准化协议实现用户与计算机或其他设备的通信&#xff0c;典型代表包括键盘、鼠标、游戏手柄等。‌ 为什么HID要与qt进行通信&#xff1f; 我这里的应…

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…

如何使用通义灵码辅助学习C++编程 - AI编程助手提升效率

一、引言 C 是一门功能强大且灵活的编程语言&#xff0c;在软件开发、系统编程、游戏开发等领域广泛应用。然而&#xff0c;其复杂的语法和丰富的特性使得学习曲线较为陡峭。对于初学者而言&#xff0c;在学习过程中难免会遇到各种问题&#xff0c;如语法理解困难、代码调试耗…