下面是我正在运行的代码.我的问题是为什么wait until在modelsim 中没有第三个触发器?控制台输出很简单GOT HERE.它从来没有上线GOT HERE 2.我认为wait until <SIGNAL> = 1连续两次相同会很好,因为两次都是正确的.我没有在那里添加'事件,所以我不认为模拟器需要看到边缘.谁能解释这种行为?
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity example_wait_failure is
end example_wait_failure;
architecture behave of example_wait_failure is
  signal r_CLK_TB : std_logic := '0';
begin
  r_CLK_TB <= '1' after 20 ns, '0' after 40 ns, '1' after 60 ns;
  p_TEST : process
  begin
    wait until r_CLK_TB = '1';
    report "GOT HERE" severity note;
    wait until r_CLK_TB = '1';
    wait until r_CLK_TB = '1';
    report …Run Code Online (Sandbox Code Playgroud) 有没有办法告诉模拟器(我正在使用 Modelsim)将信号拉到弱的“H”,当它不是由任一双向接口驱动时?
例如,如果我有一个 I2C 信号 I2C_SDA,它被声明为 2 个模块的输入输出。一个是我的实际 UUT,另一个是测试台。两者都有这样的声明:
io_i2c_sda <= r_I2C_DATA when r_I2C_DATA_EN = '1' else 'Z'; 
Run Code Online (Sandbox Code Playgroud)
所以两端都是三态的。这在模拟中工作正常,除了线路一直是蓝色('Z'),两端都没有传输。当两端都没有传输时,如何将这条线拉到代码中的“H”?
假设您有一个定义如下的信号:
signal test_count : integer range 0 to 11;
Run Code Online (Sandbox Code Playgroud)
现在,如果在模拟中test_count小于0或大于11,将导致模拟立即崩溃。我想知道的是,将其合成后会发生什么?如果test_count增加到11以上或减少到0以下,会发生什么情况?综合工具会迫使信号回绕吗?请注意,我选择了一个示例,该示例不能轻易地返回到0000。
我试图在开始时将一个字节数组插入另一个数组。这是我正在尝试完成的一个简单示例。
import struct
a = bytearray(struct.pack(">i", 1))
b = bytearray(struct.pack(">i", 2))
a = a.insert(0, b)
print(a)
Run Code Online (Sandbox Code Playgroud)
但是,这失败并出现以下错误:
a = a.insert(0, b)
TypeError: an integer is required
我有一个要从二进制文件加载的数组:
parameter c_ROWS = 8;
parameter c_COLS = 16;
reg [15:0]  r_Image_Raw[0:c_ROWS-1][0:c_COLS-1];
Run Code Online (Sandbox Code Playgroud)
我的输入文件是二进制数据,256 字节长(与 r_Image_Raw 相同的总空间)。我尝试使用$fread来完成此操作,但它仅适用于最后一行的第四列:
n_File_ID = $fopen(s_File_Name, "r");
n_Temp = $fread(r_Image_Raw, n_File_ID);
Run Code Online (Sandbox Code Playgroud)
我也尝试使用$fscanf此方法,但在打开综合工具时出现有关打包类型的错误:
while (!$feof(n_File_ID))
  n_Temp = $fscanf(n_File_ID, "%h", r_Image_Raw);
Run Code Online (Sandbox Code Playgroud)
我感觉这应该很容易做到。我是否创建了一个 2D for 循环并循环遍历 r_Image_Raw 变量,一次读取 16 位?我感觉事情不应该那么复杂。
我已经使用Xilinx工具一段时间了,它们完全可以使用以下代码:
ENTITY Example IS
  GENERIC(
    g_Mode : STRING  := "Normal"); -- "Normal", "Test"
  PORT(
    Clk : IN  STD_LOGIC;
    -- ETC 
    );
END Example;
ARCHITECTURE rtl OF Example IS
Normal_g : IF g_Mode = "Normal" GENERATE
  -- Normal Operation Code Here
END GENERATE Normal_g;
Test_g : IF g_Mode = "Test" GENERATE
  -- Test Operation Code Here
END GENERATE Test_g;
Run Code Online (Sandbox Code Playgroud)
但是我最近切换到使用莱迪思工具,第二次检查g_Mode时出现错误.错误是,"不等长度数组之间的比较总是返回FALSE".所以似乎两个生成语句中的一个永远不会执行.我的问题是,这是合法的VHDL语法,因此莱迪思工具存在问题吗?或者我的代码样式是否应该更改为不使用字符串作为泛型?
我习惯于使用 VHDL 进行编程,并且想知道在 Verilog 中执行 VHDL 中使用的某些类型操作的“最佳”方法。我认为每个问题都可以是他们自己的专用问题,但我认为最好能收集这些问题,以便人们在一个地方看到一堆 Verilog 示例,而不是分散在 5 个问题中。谢谢。
以下是我希望看到最佳实践的一些示例:
替换其他人:
我知道对于 Verilog 中的信号分配,您可以执行以下操作:
data <= 'b0;
Run Code Online (Sandbox Code Playgroud)
这会将数据中的所有位分配为零,并且如果数据更改其宽度,它仍然有效。绝妙的技巧,但是当实例化模块并将输入绑定为零时呢?例如
   Data_Module UUT
      (
       .Data(8'h00),  //'b0 doesn't work here
Run Code Online (Sandbox Code Playgroud)
属性替换:
编写灵活的代码很好,所以我喜欢根据泛型定义端口宽度,这样如果端口宽度发生变化,只需快速更新泛型,一切仍然有效。我经常有这样的VHDL代码:
signal some_data : std_logic_vector(g_DATA_WIDTH+g_GENERIC-1 downto 0);
signal some2     : std_logic_vector(some_data'length-1 downto 0);
-- OR I may have this:
left_bit <= some_data'left;
Run Code Online (Sandbox Code Playgroud)
长的when/else链:
这给我带来了麻烦。设置组合的always块并在索引上使用case语句是最好的方法吗?这看起来有很多代码。使用?运算符可能会导致一些难以辨认的代码,因此我不喜欢在较长的 if/else 链中这样做。
some_data <= X"01" when index = 0 else
             X"04" when index = 1 else
             X"02" when index = 2 else
             X"F0";
Run Code Online (Sandbox Code Playgroud)
断言:
如何在 …
在Verilog程序中使用连续赋值是否可能和/或有用?例如,是否有任何理由放置assign一个always块?  
例如这段代码:
always @(*) 
begin 
  assign data_in = Data;
end
Run Code Online (Sandbox Code Playgroud)
此外,用这种方法生成顺序逻辑是否可能?
always @(posedge clk) 
begin 
  assign data_in = Data;
end
Run Code Online (Sandbox Code Playgroud) 我习惯在emacs中用VHDL编写代码,它具有很好的美化功能,可以对齐信号分配。Verilog模式有类似的东西吗?
转换为:
r_Tx_Done <= 1'b1;
r_Clock_Count <= 0;
if (r_Done == 1'b1)
  begin
    r_SM_Main <= s_CLEANUP;
    o_Tx_Active <= 1'b0;
  end
Run Code Online (Sandbox Code Playgroud)
为此:
r_Tx_Done     <= 1'b1;
r_Clock_Count <= 0;
if (r_Done == 1'b1)
  begin
    r_SM_Main   <= s_CLEANUP;
    o_Tx_Active <= 1'b0;
  end
Run Code Online (Sandbox Code Playgroud)
Verilog模式在保持if else begin end对齐状态方面做得很好,但是并不能像我想要的那样对齐分配。请注意,if语句内部与if语句<=外部不对齐。本质上,我希望每个开始/结束块都分开处理。
generic我想在使用 VHDL-2008的部分中创建自定义类型entity。但是我在 Modelsim 中使用此代码立即收到错误。错误是:
** 错误:C:/Projects/source/My_Mux.vhd(35):靠近“is”:期待“;” 或者 ')'
请注意,第 35 行如下type t_Array:
entity My_Mux is
  generic (
    g_MUX_INPUTS : integer := 2;
    type t_Array is array (0 to g_MUX_INPUTS-1) of std_logic_vector(7 downto 0)
    );
  port (
    i_Select   : in std_logic_vector(1 downto 0);
    i_Mux_Data : in t_Array;
    o_Data     : out std_logic_vector(7 downto 0)
    );
end entity My_Mux;
architecture RTL of My_Mux is
begin
  o_Data <= i_Mux_Data(0) when i_Select = "00" else i_Mux_Data(1);
end architecture RTL;
Run Code Online (Sandbox Code Playgroud)
我考虑创建一个在代码的通用部分中定义的特殊函数。但这需要我重载实例化模块中的函数,我真的不想这样做,这似乎不必要地复杂。如果我可以在泛型中创建自定义类型,它将解决我的问题。可以使用VHDL-2008吗?
我在Verilog中使用一个简单的UART,它是ASCII值的某些定义的一部分。例如:
parameter ASCII_a  = 8'h61;
parameter ASCII_b  = 8'h62;
parameter ASCII_c  = 8'h63;
parameter ASCII_d  = 8'h64;
parameter ASCII_e  = 8'h65;
parameter ASCII_f  = 8'h66;
Run Code Online (Sandbox Code Playgroud)
等。我试图找到最好的方法来创建这些参数一次,然后在多个文件中访问它们。当您可以创建一个程序包并在需要的地方包含该程序包时,我就习惯了VHDL。我知道Verilog可以使用该include指令,但是我相信我需要将其括起来ifdefs。  
我只想创建一个SystemVerilog程序包,但我不想处理供应商工具之间的综合兼容性问题。(我知道Microsemi有点奇怪,您可以在其中包含SV文件,但是它们必须以.v结尾)。
对于您的长期Verilog编码人员,首选的方法是什么?