【发布时间】:2015-07-16 14:08:12
【问题描述】:
我习惯于使用 VHDL 进行编程,我想知道在 Verilog 的 VHDL 中执行某些类型的操作的“最佳”方式。我想这些问题中的每一个都可能是他们自己专门的问题,但我认为收集这些问题让人们只是在一个地方看到一堆 Verilog 示例而不是分散在 5 个问题上会很好。谢谢。
以下是一些我希望看到的最佳实践示例:
替换他人:
我知道对于 Verilog 中的信号分配,您可以这样做:
data <= 'b0;
这会将数据中的所有位分配为零,如果数据改变其宽度,它仍然有效。巧妙的技巧,但是当实例化一个模块并将输入绑定为零时呢?例如
Data_Module UUT
(
.Data(8'h00), //'b0 doesn't work here
替换属性:
编写灵活的代码很好,所以我喜欢根据泛型定义端口宽度,这样如果端口宽度发生变化,只需快速更新泛型,一切仍然有效。我经常有这样的 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;
长时/其他链:
这个给我带来了麻烦。最好的方法是设置组合总是块并在索引上使用 case 语句?这似乎是很多代码。使用? 操作符可能会导致一些难以辨认的代码,所以我不希望在长时间的 when/else 链中这样做。
some_data <= X"01" when index = 0 else
X"04" when index = 1 else
X"02" when index = 2 else
X"F0";
断言:
如何在 Verilog 中触发 modelsim 断言?我经常在我的 VHDL FIFO 上使用这些来检查上溢/下溢情况。例如
assert NOT_FIFO_OVERFLOW report "FIFO has overflowed, that's a bad thing" severity failure;
生成块:
在 VHDL 中,很高兴能够基于泛型生成代码块,或者如果该泛型不存在则完全删除它。例如
g_LFSR_3 : if g_Num_Bits = 3 generate
w_XNOR <= r_LFSR(3) xnor r_LFSR(2);
end generate g_LFSR_3;
g_LFSR_4 : if g_Num_Bits = 4 generate
w_XNOR <= r_LFSR(4) xnor r_LFSR(3);
end generate g_LFSR_4;
状态机枚举:
在 Verilog 中,我真的需要为每个单独的状态创建 parameters 吗?如果这是最好的方法,我会这样做,但似乎很多。我喜欢在 VHDL 中创建一个只包含每个状态的类型,然后创建该类型的状态机信号。
创建整数:
我经常有这样的代码:
signal Row_Count : integer range 0 to c_TOTAL_ROWS-1 := 0;
在 Verilog 中执行此操作的最佳方法是什么?我是否需要获取 c_TOTAL_ROWS 的日志基数 2 来找到它的最大宽度,然后基于此定义 reg?这似乎是很多工作。我相信 Verilog 默认会创建 32 位整数,但如果不需要,我不想生成额外的逻辑。我也喜欢如果超出预期范围,我的 Modelsim 仿真会崩溃。
【问题讨论】:
-
断言在 SystemVerilog 或 OVL 库中可用。 stackoverflow.com/questions/13904794/… 可能对此有所帮助?