我在一些EDA游乐场进行了一些测试,以检查在驱动某些输入时在模块中报告的模拟器工具。
这里是eda游乐场链接:https://www.edaplayground.com/x/5qK4
因此,根据我的实验,该工具在执行此类操作时报告某些错误的唯一方法是在定义输入时使用var关键字。
有人可以解释为什么声明输入的三种不同方式之间存在差异吗?
我想这意味着您可以在将其声明为电线时进行端口强制
我也在此处发布代码
module test(
input var logic a,
input logic b,
input c
);
assign a = 1'b0;
assign b = 1'b0;
assign c = 1'b0;
endmodule
答案 0 :(得分:1)
这是逻辑类型的输入变量:
input var logic a,
对此没有争议,因为每个都已明确声明*。
IEEE 1800-2012的23.2.2.3节说(<端口>端口类型是var
或wire
):
如果省略端口种类:—对于输入和输出端口,该端口 应默认为默认网络类型的网络。默认的网络类型可以 使用`default_nettype编译器指令
进行更改
因此,由于默认的default_nettype
是wire
,所以这是类型wire
的输入logic
:
input logic b,
IEEE 1800-2012的23.2.2.3节也说:
如果省略数据类型,则默认为逻辑,但 没有数据类型的互连端口
因此,这是wire
类型的输入logic
:
input c
现在,如果已经从其他位置驱动了一个变量,则从assign语句驱动一个变量肯定是非法的,所以这一行绝对是不好的:
assign a = 1'b0;
因为输入a
绝对是一个变量-是明确的。但是,如果我们将其更改为(例如)
always_comb a = 1'b0;
然后仍然没有好处,因为使用a
语句将输入视为驱动变量assign
,并且我们已经知道,从assign语句驱动变量是非法的如果它已经从其他地方驱动了。
但是,由于b
和c
是(wire
类的网络),可以将它们从一个以上的位置驱动,所以这些行应该是< / em>确定:
assign b = 1'b0;
assign c = 1'b0;
*没有项目会因为输入时间太长而迟到。因此,为什么不这样做呢?