【芯片前端】仿真向/基于静态随机函数的单比特跨时钟同步器

简介: 【芯片前端】仿真向/基于静态随机函数的单比特跨时钟同步器

前言

因为后面我想做一些其他的实验,需要一个用于仿真的模拟亚稳态的单比特同步模块,需要满足几个需求:

1.在第一拍出发跨异步亚稳态,即发生信号跳变时,同步器第一拍的结果随机为0或者为1;

2.同步器例化多份,每一个inst亚稳态的恢复值随机,横向之间互相没有关系;

3.同一个inst,输入信号跳变,每次亚稳态恢复的值随机,纵向之间相互没有关系;

4.亚稳态恢复结果能够被seed控制,稳定复现;

其实这几个需求,核心还是之前在另外一个博文里探讨过的内容,如何在静态模块中做可控制的随机:

【验证小白】静态模块module/interface中的$urandom可控随机探索

这次实际是一次具体的使用吧。

代码

每次有信号跳变时,需要在RTL中触发一次随机,将同步器的第一拍输出随机为0或者1(实际就是把打三拍之后的亚稳态恢复值,聚在第一拍模拟完成)。

第一步,做用来产生随机数的function,思路就是另一篇博客中说的方式,通过%m来差异化每一个inst随机时的%urandom的种子;

1. /*for module random ctrl by seed*/
2. string   path_str;
3. initial  path_str = $psprintf(path_str, "%m");
4. 
5. function integer urandom_range(); 
6.     input integer min, max; 
7.     integer seed, i; 
8.     begin 
9.         seed = $urandom(); 
10.         for(i=path_str.len; i>=0; i=i-1)begin 
11.             seed = seed ^ path_str.getc(i); 
12.             seed = $urandom(seed); 
13.         end
14.         urandom_range = min + $abs(seed % (max - min));
15.     end 
16. endfunction
17. /*end*/

第二步,判定输入信号是否跳变,我的做法就是,在i_clk和o_clk分别做一个i_sync_ff(i_sync_ff为实际的跨异步信号)的打拍i_sync_ff1/o_sync_org0,当i_sync_ff与i_sync_ff1保持一致或i_sync_ff与o_sync_org0保持一致时就认为i_sync_ff稳定了足够长的时间,不会触发亚稳态的问题(分别对应快转慢和慢转快);

1. reg o_sync_org0;
2. always @(posedge o_clk or negedge o_rst_n) begin
3.     if(o_rst_n == 1'b0)begin
4.         o_sync_org0 <= 1'b0;
5.     end
6.     else begin
7.         o_sync_org0 <= i_sync_ff;
8.     end
9. end
10. wire i_sync_hold = (i_sync_ff1 == i_sync_ff0) | (o_sync_org0 == i_sync_ff0);

第三步,在判定信号跳变时,触发亚稳态问题以及随机恢复;

1. reg o_sync_ff0;
2. always @(posedge o_clk or negedge o_rst_n) begin
3.     if(o_rst_n == 1'b0)begin
4.         o_sync_ff0 <= 1'b0;
5.     end
6.     else begin
7.         if(i_sync_hold)begin
8.             o_sync_ff0 <= i_sync_ff;
9.         end
10.         else begin
11.             if(urandom_range(1,10) >= 5)begin
12.                 o_sync_ff0 <= ~i_sync_ff;
13.             end
14.             else begin
15.                 o_sync_ff0 <= i_sync_ff;
16.             end
17.         end
18.     end
19. end

第四步,把o_sync_ff0再打两拍,作为同步器的最终输出;

1. reg o_sync_ff1, o_sync_ff2;
2. always @(posedge o_clk or negedge o_rst_n) begin
3.     if(o_rst_n == 1'b0)begin
4.         o_sync_ff1 <= 1'b0;
5.         o_sync_ff2 <= 1'b0;
6.     end
7.     else begin
8.         o_sync_ff1 <= o_sync_ff0;
9.         o_sync_ff2 <= o_sync_ff1;
10.     end
11. end
12. 
13. assign o_sync     = o_sync_ff2;

第五步,把o_sync_org0也打两拍输出,作为完全没有亚稳态情况下的参考输出;

1. reg o_sync_org1, o_sync_org2;
2. always @(posedge o_clk or negedge o_rst_n) begin
3.     if(o_rst_n == 1'b0)begin
4.         o_sync_org1 <= 1'b0;
5.         o_sync_org2 <= 1'b0;
6.     end
7.     else begin
8.         o_sync_org1 <= o_sync_org0;
9.         o_sync_org2 <= o_sync_org1;
10.     end
11. end
12. assign o_sync_org = o_sync_org2;

第六步,搭一个简易定向验证环境,测一下各种功能是否能出现,这个就请参考下文吧:

【验证小白】编译、仿真与波形 —— 基于VCS的通用superbench平台搭建

OK,模拟亚稳态的单比特三拍同步器就完成了,仿真一下波形看看各种情况是否有触发;

波形

电平信号跳变为1时,亚稳态恢复为错误值,导致晚一拍采样到 1;

电平信号跳变为0时,亚稳态恢复为错误值,导致晚一拍采样到 0;

电平信号跳变为0时,亚稳态恢复为正确值;

电平信号跳变为1时,亚稳态恢复为正确值;

脉冲信号,被完全正确采样;

脉冲信号,跳变为1时亚稳态恢复为错误值0,跳变为0时亚稳态恢复为正确值0,亚稳态导致这个脉冲被吃掉了;

脉冲输入过窄,导致这个脉冲被吃掉了;

上升沿亚稳态恢复正常,下降沿恢复异常;

上升沿 恢复异常,下降沿恢复异常;

波形看着好像情况是比较完备的哈,我准备先用着如果后面发现问题再说吧~~~


相关文章
|
3月前
|
前端开发 JavaScript API
解锁高效应用构建:Vuex与后端交互的前端状态同步策略,让数据流动如行云流水,紧跟前端开发的热点趋势
【8月更文挑战第27天】本文深入探讨了Vue框架下的前端状态管理库Vuex与后端服务交互时的状态同步策略。通过剖析Vuex的核心机制——状态(State)、变异(Mutation)、动作(Action)及模块(Module),文章展示了如何优雅地将后端数据加载并更新至前端状态中。特别地,借助示例代码解释了Action处理API调用、Mutation更新状态的过程,并介绍了如何通过模块化和命名空间提高状态管理的准确性和时效性。此外,还讨论了组件如何利用`mapState`和`mapActions`简化状态访问与操作的方法。遵循这些策略,开发者可以在构建复杂应用时显著提升性能与用户体验。
46 0
|
27天前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
5月前
|
应用服务中间件 开发工具 nginx
Mac M1/M2/M3 芯片环境配置以及常用软件安装-前端
Mac M1/M2/M3 芯片环境配置以及常用软件安装-前端 最近换了台新 Mac,所有的配置和软件就重新安装下,顺便写个文章。
540 1
|
3月前
|
JavaScript 前端开发 API
【前端开发】JS同步与异步调用,Vue2基础知识
本文简要介绍了JavaScript中的同步与异步调用以及Vue2的基础知识。 ### JS同步与异步调用 - **同步调用**:代码按顺序执行,每个任务完成后才执行下一个。 - **异步调用**:允许代码并发执行,不必等待前一个任务完成。 - **回调函数**:传统异步模式,如`setTimeout`。 - **Promise**:解决回调地狱问题,链式调用 `.then()`。 - **async/await**:基于Promise,使异步代码看起来像同步代码。 ### Vue2基础知识 - **核心概念**:指令、实例、组件、模板、数据绑定和生命周期钩子。 - **指令**
74 5
|
3月前
|
前端开发 芯片
用于生物电测量的低功耗八通道模拟前端芯片 Low-Power, 8-Channel AFE for Biopotential Measurement
此低功耗八通道模拟前端芯片专为生物电测量设计,集成了八个低噪声放大器与24位高精度ADC,支持125SPS至8kSPS数据速率及多种增益设置。芯片配备内置时钟、参考电压源与断线检测等功能,并兼容多种电极类型。适用于心电图、肌电图和个人健康监测设备,采用VQFN与TQFP封装,尺寸紧凑,确保医疗设备兼具性能与便携性。
|
3月前
|
编解码 前端开发 芯片
全国产化用于生物电测量的低功耗双通道模拟前端芯片 Low-Power, 2-Channel AFE for Biopotential Measurement
这款低功耗双通道模拟前端芯片专为生物电测量设计,集成两个低噪声放大器与24位高精度ADC,支持125至8k SPS的数据速率及多种增益设置。工作电压2.7至3.3V,内置RLD、断线检测等功能,并具备SPI接口。适用于穿戴式健康监测设备、运动智能装备及医疗仪器,如心电图监测。提供TQFP(32)与VQFN(32)封装选项,尺寸紧凑,满足便携与小型化需求。
|
5月前
|
前端开发
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
|
前端开发 测试技术 芯片
【前端验证】关于那道经典概率题,用UVM环境来仿真下是男孩的概率
【前端验证】关于那道经典概率题,用UVM环境来仿真下是男孩的概率
|
前端开发 芯片
【芯片前端】延迟一拍出数的握手型ram结构的一次探索
【芯片前端】延迟一拍出数的握手型ram结构的一次探索
108 0
|
前端开发 JavaScript
Jquery前端分页插件pagination同步加载和异步加载
Jquery前端分页插件pagination同步加载和异步加载
74 0
下一篇
无影云桌面