在 Verilog 程序中使用连续分配?

2024-04-07

在 Verilog 程序中使用连续赋值是否可能和/或有用?例如,是否有任何理由将assign里面一个always堵塞?

例如这段代码:

always @(*) 
begin 
  assign data_in = Data;
end

此外,是否可以用这种方法生成顺序逻辑?

always @(posedge clk) 
begin 
  assign data_in = Data;
end

它被称为程序连续分配。这是使用一个assign or force(及其相应的对应物deassign and release)在程序块内。当到达程序块中的行时,将创建一个新的连续分配过程。assign可以应用于寄存器类型,例如reg, integer, and real. force可以应用于寄存器和网络(即wires)。自 1364 年至 1995 年以来,它一直是 LRM 的一部分。

  • IEEE 标准 1364-1995 § 9.3
  • IEEE 标准 1364-2001 § 9.3
  • IEEE 标准 1364-2005 § 9.3
  • IEEE 标准 1800-2005 § 25.3
  • IEEE 标准 1800-2009 § 10.6
  • IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html § 10.6

大多数工具都可以综合程序连续分配。然而,建议限制使用模拟块的行为建模、测试台文件或修复 RTL 门功能不匹配。

  • always @* assign data_in = Data;
    功能相同
    always @* data_in = Data;

  • always @(posedge clk) assign data_in = Data;
    其功能与以下相同:
    always @(posedge clk)
      enable = 1;
    always @*
      if (enable==1) data_in = Data;

程序连续赋值的有效使用应适用于以下情况:

always @(posedge clk or negedge rst_n, negedge set_n) begin
   if (!rst_n)      q <= 1'b0;
   else if (!set_n) q <= 1'b1;
   else             q <= d;
end

它将合成一个具有异步设置和复位优先级的触发器。然而,在模拟中,如果以下情况,模型是不准确的:rst_n and set_n那么两者都低rst_n走高。q如果异步集仍处于启用状态,但敏感度列表中没有任何内容可触发,则应转到 1。这是 Verilog 的一个有据可查的问题。当与合成器的 translate off 关键字一起使用时,这是 RTL 中允许程序连续赋值的一种情况。这release/deassign允许以通常的方式分配寄存器/线路。

// translate_off
always @(rst_n or set_n)
  if (rst_n && !set_n) force q = 1'b1;
  else                 release q;
// translate_on

OR(当前有效但不鼓励)

// translate_off
always @(rst_n or set_n)
  if (rst_n && !set_n) assign q = 1'b1;
  else                 deassign q;
// translate_on

Using assign/deassign这种方式被认为在未来的 IEEE 1800 版本中被贬值。 IEEE 标准 1800-2005 § 25.3、IEEE 标准 1800-2009 § C.4.2 和IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html§ C.4.2 认识到assign这种方式使用会导致混乱并且是错误的根源。使用force/release如果需要的话程序连续赋值。

在使用过程连续赋值的生成中(使用force/release) 仅应在绝对必要时使用。替代方法更可靠。

程序连续赋值的误用及解决方案:

  • 组合逻辑开启reg:

    always @(sel)
      if (sel) assign reg1 = func1(x,y,z);
      else     assign reg1 = func2(a,b,c);
    
    • 解决方案:

      always @* // <- IEEE Std 1364-2001 construct
        if (sel) reg1 = func1(x,y,z);
        else     reg1 = func2(a,b,c);
      
  • 组合逻辑开启wire:

    always @(sel)
      if (sel) force wire1 = func1(x,y,z);
      else     force wire1 = func2(a,b,c);
    
    • 解决方案:

      assign wire1 = sel ? func1(x,y,z) : func2(a,b,c);
      
  • 顺序逻辑:

    always @(posedge clk)
      if (sel) assign reg2 = func1(x,y,z);
      else     assign reg2 = func2(a,b,c);
    
    • 解决方案 (assuming原来的功能是wrong):

      always @(posedge clk)
        if (sel) reg2 <= func1(x,y,z); // Non-blocking assignment !!!
        else     reg2 <= func2(a,b,c);
      
    • 解决方案 (assuming原来的功能是correct):

      reg flop_sel;
      always @(posedge clk)
        flop_sel <= sel; // Non-blocking assignment !!!
      always @*
        if (flop_sel) reg2 = func1(x,y,z); // Blocking assignment !!!
        else          reg2 = func2(a,b,c);
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Verilog 程序中使用连续分配? 的相关文章

  • 使用 Verilator 和 VPI 读取寄存器数组

    所以我在我的verilog中定义了以下寄存器 reg 31 0 register mem 0 15 verilator public 我的目标是从我的 verilator c 代码中读取存储在其中的 16 个值中的每一个 我发现有关 VPI
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 连接分层模块:SystemVerilog 中的结构与接口

    在 SystemVerilog 中 分层模块可以通过简单数据类型 复杂数据类型 结构 联合等 或接口进行连接 我感兴趣的功能是将两个模块之间的所有信号聚合到一个地方 这简化了代码的维护 例如 在下面的例子中 更改 s point 的定义而不
  • Verilog:添加寄存器的各个位(组合逻辑,寄存器宽度可参数化)

    我正在尝试想出一种方法来添加寄存器的各个位 例如 if regA 111000 then regB 3 位的总和regA 1 Verilog或SystemVerilog中是否有可以直接使用的可综合函数 运算符来执行此操作 如果不是 那么问题
  • 「HDLBits题解」Gates4

    本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接 Gates4 HDLBits module top module input 3 0 in out
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • 赋值语句中的“others=>'0'”是什么意思?

    cmd register process rst n clk begin if rst n 0 then cmd r lt others gt 0 elsif clk event and clk 1 then cmd r lt end if
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • 自动任务和静态任务有什么区别,为什么我们不能通过引用传递静态任务

    静态任务和自动任务有什么区别 program class ref int index value class holding values int ass array task assign value int value int inde
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐