首页 > 其他分享 >verilog设计行为仿真和时序仿真不一致, 原来是敏感信号的问题

verilog设计行为仿真和时序仿真不一致, 原来是敏感信号的问题

时间:2023-12-12 12:01:58浏览次数:34  
标签:仿真 case 27 cout 时序 b0 verilog bit b1

描述

最近在vivado中设计一个计算器: 28bit有符号加减法,结果出现行为仿真和时序仿真不一致情况

代码

r_a, r_b : 对计算数据a, b的寄存器存储, 也是计算器的数据输入
s_bit : 符号位
cout : 28bit计算器的进位输出 cout[27] : 最高位进位, 用来判断符号以及加法进位

always@(a, b) begin // 1
// always@(r_a, r_b) begin // 2
	case({a[27], b[27]}		// 1
	case({r_a[27], r_b[27]}) // 2
			2'b00: s_bit = 1'b0;
			2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
			2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
			2'b11: s_bit = 1'b1;
			default:s_bit = s_bit;
		endcase
	end

输出结果代码

always@(posedge clk or negedge rstn) begin
		if(!rstn)
			result <= 'd0;
		else
			result <= {s_bit, sum};
	end

当条件为1时行为仿真错误,时序仿真正确, 如下
image

当条件为2时行为仿真和时序仿真均正确 , 如下
image

说明

此处的敏感信号列表只有当为r_a, r_b时结果才正确,其他情况均错误

分析

image

t0 : a0, b0 变化,cout0 = 0, case0 = 2'b00, s_bit0 = 0
t1 : r_a0, r_b0 变化并且开始进行计算,cout1 = 0, case1 = 2'b00, s_bit1 = 0
t2 : a1, b1 变化, cout1 = 0, case = 2'b01, s_bit = 1
t3 : r_a1, r_b1 变化开始进行计算, cout3 = 1, case = 2'b01, s_bit = 1

为什么会发生错误呢?

t0 : a, b变化, 但是此时的cout = 0, 并不是因为计算等于0 ,因为此时并未开始计算,所以s_bit也会错误
t1 : r_a, r_b 变化,开始计算,现在的cout是正确的,但是此时并不更新s_bit,因为敏感信号没有变化
t2 : a, b发生变化, 但是此时的cout却是上一个r_a, r_b计算的结果,但是我们在此时对s_bit进行赋值,还是会发生错误
t3 : 终于输出计算结果, 但是此时的s_bit是错误的, 因为cout与case并不同步, case超前于cout一个上升沿(而非一个clk)

所以,在设计的时候一定要分析好时序, 尽管s_bit使用的是组合逻辑, 但是,在仿真过程中出现了case选项和条件值不同步的情况

另外

代码块A

always@(a, b) begin
	case({a[27], b[27]})
		2'b00: s_bit = 1'b0;
		2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
		2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
		2'b11: s_bit = 1'b1;
		default:s_bit = 1'b0;
	endcase
end

代码块B

always@(*) begin
	case({a[27], b[27]})
		2'b00: s_bit = 1'b0;
		2'b01: s_bit = cout[27] ? 1'b0 : 1'b1;
		2'b10: s_bit = cout[27] ? 1'b0 : 1'b1;
		2'b11: s_bit = 1'b1;
		default:s_bit = 1'b0;
	endcase
end

代码块B 等价于 代码块A, 废话,肯定等价
我的意思是,always@(*) 会自动将case(a,b)变成敏感信号,从而变化为always@(a, b), 其他信号变化无用
如果你的控制变量是别的, 综合工具(此处是vivado)会将控制信号变为敏感信号.

本篇结束,大家设计代码一定要注意时序匹配

标签:仿真,case,27,cout,时序,b0,verilog,bit,b1
From: https://www.cnblogs.com/tiruo/p/17896491.html

相关文章

  • 基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述      支持向量机(SVM)和多层感知器(MLP)是两种常用的机器学习算法,它们在数据预测和分类任务中都有广泛的应用。下面将详细介绍这两种算法的原理和数学公式。 一、支持向量机(SVM) ......
  • 基于PSD-ML算法的语音增强算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022A 3.算法理论概述      PSD-ML(PowerSpectralDensityMaximumLikelihood)算法是一种基于最大似然估计的语音增强算法,通过对语音信号的功率谱密度进行估计,并利用估计结果对原始语音信号进行滤波处理,以达......
  • Simulink建模与仿真(6)-Simulink使用基础(MATLAB的单元与结构体)
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 基于小波变换的分形信号r指数求解算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       基于小波变换的分形信号r指数求解算法是一种利用小波变换和分形理论对信号进行分析的方法。下面将详细介绍这种算法的原理和数学公式。         分形信号是一种......
  • 多开器在Windows电脑上的流体力学仿真应用
    多开器在Windows电脑上的流体力学仿真应用摘要:随着计算机技术的不断发展,流体力学仿真成为了研究和解决涉及液体和气体运动问题的重要工具。而在Windows电脑上,多开器的出现为流体力学仿真应用提供了更大的便利性和效率。本文将介绍多开器在Windows电脑上的流体力学仿真应用,并探讨......
  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:CP加入,删除效果:系统RTL结构图:2.算法涉及理论知识概要正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM技术的主要优势在于其可以有效地抵抗多径效应和频率......
  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:   CP加入,删除效果:   系统RTL结构图:   2.算法涉及理论知识概要          正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM......
  • 时序图之图书馆借阅
    时序图    ......
  • 12.7周四uml之类图,用例图,活动图,时序图
    今天课上的测试中检查了我们uml的理解,成功让我意识到了对类图等概念理解中的不足,为此,我重新翻阅软件设计这本书,并结合网络上的类图,用例图,活动图,时序图等,总结了以下内容。类图(ClassDiagram)是面向对象系统建模中最常用和最重要的图,是定义其它图的基础。主要是用来显示系统中的类、......
  • m基于FPGA的8PSK调制解调系统verilog实现,包含testbench测试文件
    1.算法仿真效果vivado仿真结果如下:   借助matlab看8PSK的星座图:   2.算法涉及理论知识概要        随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位相移键控)作为一种高阶调制方式,具有更高的频......