logic - 首先分配,然后在 if 块中重新分配,以替代 Verilog 中的 if-(else if)-else
问题描述
最好先给变量赋值,然后在 if 块中重新赋值,而不是使用 if-(else if)-else 块,其中 if 和 else 块中的赋值相同,else if 块中的赋值是不同的任务。
always @(*) begin
if condition1 begin
var = val1;
end
else if condition2 begin
var = val2;
end
else begin
var = val1;
end
end
对比
always @(*) begin
var = val1;
if condition2 begin
var = val2;
end
end
鉴于条件 1 和条件 2 是互斥的,我认为这两个块应该综合相同的逻辑,并且选择一个而不是另一个纯粹是审美。我的想法是正确的,还是一种实现的合成方式与另一种不同?如果我的想法是正确的,社区更喜欢哪种方法?
编辑:在 racraman 的评论之后添加了互斥标准。
解决方案
至于您要问的一般原则:走哪条路线都没有关系。合成器将足够聪明,无论如何都可以解决它。对于模拟,首先执行默认分配的选项可能执行得更慢(特别是如果分配是非阻塞的),但我不会担心。
就我个人而言,我更喜欢第二种,因为对于普通读者来说,更明显的是,您在生成不需要的闩锁方面已经涵盖了您的基础(换句话说,您总是分配给var
)。
说了这么多,你的例子(原则上)非常简单,在这种特殊情况下,很明显需要一个 mux,你可能根本不需要一个 always 块,应该只使用assign
一个三元运算符.
我说“原则上”是因为你的逻辑没有真正的意义。你说你的条件是互斥的,但是如果两个条件都不活跃会发生什么?你真的需要一个锁存器来保存以前的输出吗?如果不是,为什么你有两个条件?
推荐阅读
- c++ - 计算 QTableWidget 所需的确切高度
- vba - 使用带有 Selenium 的 VBA 进行网页抓取
- reactjs - 在 ReactJS 中的 textarea 内标记
- unit-testing - 如何在 Flutter 单元测试中模拟平台
- spring-boot - 使用 Kafka 作为独立库的 spring-boot 云流
- c++ - 在浮点环境中更改舍入模式的实际用途是什么?
- php - 从 Php Laravel 中的 Api 响应填充数据库
- javascript - 如何使用 Javascript 和 jquery 在不同页面中显示所有图像
- android - 如何在android对话框中显示图像(动态)?
- javascript - 如何仅在循环(其中包含函数)完成时运行语句?