【问题标题】:a few issues about 'tri' data type in SystemVerilogSystemVerilog 中关于“tri”数据类型的一些问题
【发布时间】:2015-06-26 17:07:35
【问题描述】:

这些天我才开始使用“tri”数据类型。我已经在两个不同的模块中应用了这种数据类型。它在逻辑和结构模拟(综合之前)方面很好地服务于第一个模块,基本上我有一堆逻辑线分配给同一个 tri,如下所示:

logic wire1;
logic wire2;
logic wire3;
tri tri1;

assign tri1 = wire1;
assign tri1 = wire2;
assign tri1 = wire3;

在 SystemVerilog 的 IEEE 标准中,它说

线网可用于由单个门或连续分配驱动的网络。 tri 网络类型可用于多个驱动程序驱动网络的情况。来自电线或 tri 网络上相同强度的多个来源的逻辑冲突会导致 x(未知)值。

所以我假设它像上面的代码一样工作。但是,当我将相同的逻辑应用于我的第二个模块时,

integer var_a, var_b, var_c, var_cnt;
logic arrWire1[1:0][3:0];
logic arrWire2[1:0][1:0];
logic arrWire3[1:0];
tri triArrWire[7:0];

always_comb begin
  var_cnt = 7;
  for (var_a=1; var_a<=0; var_a--) begin
    for (var_b=1; var_b<=0; var_b--) begin
      for (var_c=(1+var_b*2); var_c<=var_b*2; var_c--) begin
        triArrWire[var_cnt] = arrWire1[var_a][var_c];
        triArrWire[var_cnt] = arrWire2[var_a][var_b];
        triArrWire[var_cnt] = arrWire3[var_a];
        var_cnt --;
      end
    end
  end
end

ModelSim 对此的投诉:

(vlog-2110) 非法引用网络“triArrWire”。

基本上,第二个模块所做的只是简单地模仿第一个模块,但在一个 always_comb 块中。但是为什么它没有通过 ModelSim 编译检查呢?我在这里遗漏了什么吗?

另一方面,通常将不同的电线连接到一根电线吗?我这样做的原因是因为大多数电线将处于高阻抗'z',并且其中只有一个将具有 0 或 1 并驱动三网。这让我想将它们合并到一个三网中,以便更容易地将其作为模块的输出。

欢迎提出任何想法。非常感谢您的帮助。

太海

【问题讨论】:

    标签: types simulation system-verilog modelsim


    【解决方案1】:

    您不能对电线进行程序分配。要建立连接,您需要像在第一个模块中那样使用连续分配。为此,您需要一个 generate-for 循环。类似:

    for (genvar var_a=1; var_a<=0; var_a--) begin
      for (genvar var_b=1; var_b<=0; var_b--) begin
         for (genvar var_c=(1+var_b*2); var_c<=var_b*2; var_c--) begin
            parameter var_cnt = (some expression of var_a and var_b); 
            assign triArrWire[var_cnt] = arrWire1[var_a][var_c];
            assign triArrWire[var_cnt] = arrWire2[var_a][var_b];
            assing triArrWire[var_cnt] = arrWire3[var_a];
         end
      end
    end       
    

    表情就交给你了,应该不会太难……

    【讨论】:

    • 谢谢戴夫。这就像一个魅力。但是我这里还有两个cmets:1)我认为实际上阻塞程序分配可以用来连接电线。请参阅 SystemVerilog 的 IEEE 标准中的 Sec 10.4。 2) 最初我使用 generate struct 来完成所有的连接,但后来我想表达 var_cnt 的方式对 ModelSim 来说不太有意义,所以我选择将它声明为一个整数,并希望允许一些灵活性always_comb 中的表达式,它确实如此。但后来 ModelSim 似乎不喜欢 triArrWire 被提及,因为它是 tri 类型,而不是逻辑。
    • 没有。不能对电线进行程序分配、阻塞或非阻塞。 10.4 节只提到变量,而不是连线。请参阅 (go.mentor.com/wire-vs-reg)。
    猜你喜欢
    • 2019-11-30
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多