问题标签 [register-transfer-level]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
verilog - 在 Verilog 中使用不从零开始的索引声明变量
我在 Verilog 中使用这个电汇声明:
我的代码有效,并且我以前见过这种编码风格,但我不确定实际发生了什么,我只能猜测正在声明一条 9 位宽的线。这就是正在发生的事情吗?我想在网上阅读更多内容,但我不知道这叫什么,所以对这个简单化的问题表示歉意。
verilog - Shift a number left in verilog and only retain upper bits
I have the following wires in verilog:
I want to shift mywire left by some amount, but only retain the upper 8 bits:
Is there a cleaner way to do this?
Perhaps something like this:
verilog - 定点/浮点乘法的最佳方法是什么?
一般来说,有两种方法,我知道什么是乘法定点/浮点乘法。我是像 Verilog 这样的硬件工程师。
1.Verilog的一种方式 -浮点乘法
2.另一种方法是左移“<<”然后右移“>>”
我认为上述方法的结果都是一样的。但我不确定,所以我在这里问我想知道哪种方式可以使用和纠正?
更新1。
1.方式一。
2.方式二。3.98 = 几乎'b11_111110101...在这里,我们可以选择适合的深度来计算乘法。8 = 'b1000 11_11111010 * 1000 = (4 int),(0 frac) * (2 int),(8 frac) 11 1111101000 = 8144 然后我们得到 8144*2^-8 = 31.8125
更新 2
我对如何将固定分数应用于整数和Verilog - 浮点乘法之间的乘法感到困惑
哪一个是更好的方法?
system-verilog - 在重置感知 always_ff 块中不重置寄存器的含义是什么?
不在复位感知 always_ff 块内复位触发器的后果是什么?
示例 1:
示例 2:
示例 1 和示例 2 之间的唯一区别是,在示例 2 中,reg_b 没有任何重置条件。这个后端/综合错误的后果是什么?我有前端 RTL 设计背景,在合成方面经验很少。所以,我试图理解为什么上面的示例 2 是一个不好的做法。
一个明显的问题是 - 在示例 2 中重置 reg_b 之后将是 X。因此,如果 reg_b 用于任何控制逻辑,那么它可能会在设计中引入错误。除此之外,这还会产生什么其他问题?
verilog - SystemVerilog for 循环具有非阻塞分配的问题?
当我从事基于 SystemVerilog 的 FPGA 设计时,我遇到了一种情况,我必须计算时钟沿上 4 个元素的数组的总和。我能够使用带有非阻塞分配语句的 for 循环来做到这一点。
该设计在 Quartus 15.0 上成功合成,但是当我尝试在 Modelsim Altera 上使用相同的 RTL 运行仿真时,结果出乎意料。我写了一个示例代码来说明这一点。
在此示例代码中,总和是使用非阻塞分配计算的。它的目的是在 clk 的第一个 posedge 上具有 (1+3+5+6)=15 的值;我在原始硬件中观察到。但在模拟中,在 clk(即abc[3])的 posedge 处,结果为 6。由于 systemverilog 模拟器安排了非阻塞语句的分配,我相信创建了 4 个 sum 实例,即。
由于所有计划的分配同时发生,可能是最后一个实例更新的总和,我们的总和 <= 0 + 6 的值。如果我错了,请纠正我。
现在我的问题是如何让模拟器按顺序安排这些分配,以便即使在模拟中也能得到 15 的值?由于在综合中阻止分配不是一个选项,我找不到任何方法来保持 RTL 一致。谢谢。
verilog - 带 2 个复位的 D 触发器:合成错误
我正在合成一个数字块,我需要一个带有 2 个异步复位的 D 触发器。(原因是我将使用可用时钟驱动一个复位,我将使用第二个复位我的数字块的所有寄存器)我准备了以下代码:
但我收到以下错误:
我也试过
但我也有错误。
你有想法纠正我的代码吗?非常感谢!
verilog - 为什么我们在使用 Verilog/Systemverilog 中的 Always Block 设计的组合电路中使用 Blocking 语句?为什么不是非阻塞?
到处都提到它作为指导方针,但经过深思熟虑后,我想知道如果我们在 Always Block for Combinatorial 中也使用 Nonblocking 语句会造成什么危害。我不会把两者混在一起。但是我的感觉是,当我们在 Always Block 中使用 Nonblocking for Combinatorial 语句时,它更准确地代表了硬件。难道不是……?
例如,如果我们采用以下电路:
在此图中,当提供输入 a、b、c 时,输出 x1 和 x 将不会立即可用。会有登机口延迟。第一个 x1 可用,然后 x 可用。如果我们使用阻塞语句,两者都可以立即使用。如果我们使用非阻塞,它更准确地类似于硬件。
例如,如果我们根据上图采取以下代码
这综合为:
两者都被合成为与门,并给出相同的模拟结果,但是当我们检查增量时间输出的变化时,我觉得与阻塞相比,非阻塞更准确地匹配硬件。
我还经历了: IEEE P1364.1 / D1.6 Verilog® 寄存器传输级综合标准草案,它指定了对顺序建模使用非阻塞,但没有具体指定使用 Always Block 的组合建模使用阻塞。它说不要在组合语句中混合两者(阻塞和非阻塞)。
所以,我们不应该在处理纯组合逻辑的总是块中使用非阻塞组合语句(非顺序/不涉及时钟)
verilog - 在(系统)verilog 仿真中从命令行定义参数
我有一个“受约束”的模块,其中有几个延迟作为参数。我想模拟模块中所有可能的延迟配置。
由于我有很多配置要测试,我不想在同一个测试台中实例化所有可能的配置。
我的想法是为每个配置启动一个模拟。
我考虑过生成一个模拟脚本,该脚本将为每个延迟配置启动模拟。问题是我无法使用从命令行检索到的值来覆盖模块的参数。
我用$value$plusargs("ARG=%d",val)
的和是变量的事实val
与后面的不兼容defparam
。
完美的事情是从命令行参数创建一个定义或 localparam,但我在研究中没有找到任何关于它的信息。
我也愿意接受有关另一种方式进行这些模拟的任何建议,也许更有效,因为我认为这样做会很长。
PS:为了避免为每种配置重新编译和重新启动模拟器,我还考虑过在每种情况下重新实例化测试模块。但是,我认为(系统)verilog 不可能。