Verilog 切片方向与 VHDL 不同

问题描述 投票:0回答:1

我有一个 VHDL 实体,其中包含一些不受约束的

std_logic_vector
端口,该实体由 verilog 模块封装,该模块明确定义了这些端口宽度。

Verilog 包装器:

module conv_wrapper (din,dout,clk,ce);
input [7:0] din;
output [7:0] dout;
input clk;
input ce;
conv conv_inst (
.din(din),
.dout(dout),
.clk(clk),
.ce(ce));
endmodule

VHDL模块:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

entity conv is
    port(
        clk  : in  std_logic;
        ce   : in  std_logic;
        din  : in  std_logic_vector;
        dout : out std_logic_vector
    );
end entity conv;

architecture behavioural of conv is

    signal s_nosignbit : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
    signal s_nosignbit_not : std_logic_vector(din'high - 1 downto din'low) := (others => '0');
    signal s_dout : std_logic_vector(din'range) := (others => '0');
    signal msb : std_logic := '0';

begin
    -- Assign the MSB
    msb <= din(din'high);
    -- Assign the rest of the bits excluding the MSB
    s_nosignbit <= din(din'high - 1 downto din'low);
     -- Perform bitwise NOT operation on s_nosignbit
    s_nosignbit_not <= not s_nosignbit;
    -- Concat
    s_dout <= msb & s_nosignbit_not;
    dout <= s_dout;
end architecture behavioural;

VHDL 模块本质上只是将数字转换为 2 的补码。可能有更简单的方法可以做到这一点,但这并不是真正的重点。

我在模拟过程中收到错误消息:

s_nosignbit <= din(din'high - 1 downto din'low);
错误地分配了值,因为“切片方向与其索引类型范围不同”。 我经常在设计中使用不受约束的端口,但以前从未见过这种情况。 Vivado 是否无法正确地将
7:0
翻译为
7 downto 0

使用 Vivado 2024.1

slice verilog vhdl vivado
1个回答
0
投票

有几件事

  1. Verilog 下的 VHDL 没有标准,反之亦然,因此每个工具供应商都会提供不同的功能和限制。
  2. 由于 1,请保持 VHDL 和 verilog 域之间的接口处使用的类型非常简单,例如缩放器(1 位)或数组/向量(一组位)。 没有记录、结构、枚举、数组的数组等。
  3. 采取 2) 进一步明确指定端口的大小,不要指望工具根据适用于任一语言的规则来计算端口的大小。
    基于此,我将在 VHDL 中将向量大小指定为
    din  : in  std_logic_vector(7 downto 0);
    。对 doout 进行相同的更改。
  4. 如果您最终使用组件声明,则对组件声明进行相同的更改。
  5. 在包装器模块和实例上以相同的顺序对端口进行排序。 不要指望语言本身能够正确执行命名关联。 在此规则中包含组件声明。

混合 VHDL 和 Verilog 的一般规则是降低您的期望,而不是失望。

© www.soinside.com 2019 - 2024. All rights reserved.