我正在学习VHDL,我正在尝试从示例,语法指南和实验中学习.
有一点我不太明白为什么你想要提供多个架构.例如,这个示例MUX代码:
architecture behv1 of Mux is
begin
process(I3,I2,I1,I0,S)
begin
-- use case statement
case S is
when "00" => O <= I0;
when "01" => O <= I1;
when "10" => O <= I2;
when "11" => O <= I3;
when others => O <= "ZZZ";
end case;
end process;
end behv1;
architecture behv2 of Mux is
begin
-- use when.. else statement
O <= I0 when S="00" else
I1 when S="01" else
I2 when S="10" else …Run Code Online (Sandbox Code Playgroud) 为了测试我的 Chisel 设计,我将Icarus与cocotb一起使用。但是,如果在 verilog 模块代码中没有明确询问 Icarus 不会生成 VCD 跟踪,如下所示:
`ifdef COCOTB_SIM
initial begin
$dumpfile ("my_module_name.vcd");
$dumpvars (0, my_module_name);
#1;
end
`endif
Run Code Online (Sandbox Code Playgroud)
为了在每次生成 chisel 模块时添加此内容,我编写了一个名为cocotbify.py 的Python 小脚本,在生成的模块下“注入”此代码。
同样,要添加一些 systemVerilog assert()/assume() 以使用yosys-smtbmc进行正式检查,我必须在生成的每个 verilog 模块下“注入”代码。我还破解了一个名为smtbmcify.py的小 python 脚本来注入我的断言/假设代码。
我意识到这是一个 hack,但我找不到直接在 Chisel 模块下执行此操作的好方法。我知道有BlackBox,但我不想实例化子模块,并且函数 setInline 创建第二个 verilog 文件(我想直接在模块中写入)。
我在 Chisel scala 代码中看到了一种名为ChiselAnnotation的类型,但我不确定这是要使用的东西,我现在不知道如何使用。
我是第二年的本科生.
我需要模拟Verilog程序作为我的教学大纲的一部分.但遗憾的是我的大学使用的是Xilinx ISE,它不适用于Mac.
所以请帮我解决最好的软件以及如何安装和使用它们的一些详细步骤.
提前致谢
我正在尝试建立一个缓冲区,以便为小型CPU设计保存16位,16位宽的指令.
我需要一种从我的测试平台将指令加载到缓冲区的方法.所以我想使用一个std_logic_vectors数组来实现这一目标.但是,我收到语法错误,我不知道为什么(或者如果我允许在VHDL中执行此操作).
语法错误位于我声明的行 instructions
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity instruction_buffer is
port
(
reset : in std_logic;
instructions : in array(0 to 15) of std_logic_vector(15 downto 0);
instruction_address : in std_logic_vector(3 downto 0);
clk : in std_logic;
instruction_out : out std_logic_vector(15 downto 0)
);
end instruction_buffer;
Run Code Online (Sandbox Code Playgroud)
我也试过这样做,但后来我的实体端口映射中出现语法错误,告诉我这std_logic_vector是一个未知的类型.我发誓,VHDL的语法错误没有C哈哈那么有意义
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
package instructionBuffer is
type instructionBuffer is array(0 to 15) of std_logic_vector (15 downto 0);
end package instructionBuffer;
entity instruction_buffer is
port
(
instruction_address …Run Code Online (Sandbox Code Playgroud) 据我所知,以下代码正确地进行了合成和模拟,但XST仍然发出以下警告: value(s) does not match array range, simulation mismatch.是否有我遗漏的东西?
使用的工具:Xilinx ISE项目导航器(合成器:XST)FPGA:SPARTAN 3E
module error_example(
input [47:0] data,
input [2:0] sel,
output [5:0] data_out
);
assign data_out = data[sel*6 +: 6];
endmodule
Run Code Online (Sandbox Code Playgroud)
WARNING:Xst:790 - "error_example.v" line 8: Index value(s) does not match array range, simulation mismatch.
就像我说的,这是有效的,我已经完成了数学运算:
sel 可以有0到7之间的值,
if sel为0,那么data_out = data[5:0]
......
如果sel是7,那么data_out = data[47:42]
我应该在这里做些不同的事吗?这是XST中的错误吗?
我有一个用 Verilog(重要的是不是 SystemVerilog)编写的项目,由于在设计的不同部分之间传递的信号数量太多,它变得有点难以管理。因为我有几个模块都需要相同的信号,所以我想尝试将它们合并为较少数量的命名对象。问题是如何去做。
假设这是我人为的例子:
module mymodule(sig_a_in, sig_b_in, sig_c_in, sig_d_in, sig_e_in,
sig_a_out, sig_b_out, sig_c_out, sig_d_out, sig_e_out);
input wire sig_a_in, sig_b_in, sig_c_in;
input wire [5 : 0] sig_d_in;
input wire [31 : 0] sig_e_in;
output reg sig_a_out, sig_b_out, sig_c_out;
output reg [5 : 0] sig_d_out;
output reg [31 : 0] sig_e_out;
endmodule
Run Code Online (Sandbox Code Playgroud)
在我看来,重要的是我可以按名称引用信号的可读性。但是,我不想将它们全部单独传递给每个模块。同样,我在这个项目中只使用 Verilog,所以 SystemVerilog 构造是不可能的。
我的第一个想法是我只需将它们组合成一个总线,然后使用定义的名称来引用各个电线。然而,这有点笨拙,尤其是当您将其他总线添加到混音中时。这在我人为的例子中非常简单,因为信号具有明显的隐式顺序,但在现实生活中它们没有。
`define SIGNAL_BUS_WIDTH 41
`define A 0
`define B 1
`define C 2
`define D 3
`define E 9
module mymodule(signal_bus_in, signal_bus_out);
input wire [`SIGNAL_BUS_WIDTH-1 : …Run Code Online (Sandbox Code Playgroud) 我创建了一个模块,它接受一个指定模块数据线字节宽度的参数。它看起来像:
module wrapper#
(
parameter DATA_BYTE_WIDTH = 1
)
(
din, dout, ..
);
localparam DATA_BIT_WIDTH = 8*DATA_BYTE_WIDTH;
input [DATA_BIT_WIDTH-1:0] din;
output [DATA_BIT_WIDTH-1:0] dout;
.....
generate
if( DATA_BYTE_WIDTH == 1 ) begin
// Various modules and interconnects for 1-byte data
else if( DATA_BYTE_WIDTH == 2) begin
// Various modules and interconnects for 2-byte data
else if....
// and so on, for 4, 8, and 16
else
// DATA_BYTE_WIDTH is not a valid value
// HERE is where I want to …Run Code Online (Sandbox Code Playgroud) 我是 Verilog 语言的新手,想做一些练习来熟悉它。我在HDLbits上遇到了这个问题:DFF8ar
这个问题要求我创建 8 个具有高电平有效异步复位功能的 D 触发器。我使用一个case语句来处理areset信号:
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output reg[7:0] q
);
always @(posedge clk or posedge areset) begin
case (areset)
1'b1: q <= 8'b0;
default: q <= d;
endcase
end
endmodule
Run Code Online (Sandbox Code Playgroud)
但是,如果我将case语句切换为if-else语句,结果将是正确的:
always @(posedge clk or posedge areset) begin
if (areset)
q <= 8'b0;
else q <= d;
end
Run Code Online (Sandbox Code Playgroud)
即使进行了一些研究后,我也不知道其背后的原因。if-else陈述和 …