verilog - 如何将此 SystemVerilog sim 转换为 Verilog
问题描述
我在 Verilog 中做一个关于 SPI Master 实现的教程。我已经非常了解该模块的工作原理以及不同块的作用。
但现在我来到了模拟,它是用 SystemVerilog 编写的。我正在使用 Xilinx ISE 设计套件(我有一个 Mimas V2 - Spartan 6 FPGA 开发板),它不支持 SystemVerilog。
我的问题是,如何在 Verilog 中编写这个 SystemVerilog 模拟?
我试过用 reg 替换逻辑类型,但我不知道.sv
和之间的其他区别.v
是什么。
///////////////////////////////////////////////////////////////////////////////
// Description: Simple test bench for SPI Master module
///////////////////////////////////////////////////////////////////////////////
module SPI_Master_TB ();
parameter SPI_MODE = 3; // CPOL = 1, CPHA = 1
parameter CLKS_PER_HALF_BIT = 4; // 6.25 MHz
parameter MAIN_CLK_DELAY = 2; // 25 MHz
logic r_Rst_L = 1'b0;
logic w_SPI_Clk;
logic r_Clk = 1'b0;
logic w_SPI_MOSI;
// Master Specific
logic [7:0] r_Master_TX_Byte = 0;
logic r_Master_TX_DV = 1'b0;
logic w_Master_TX_Ready;
logic r_Master_RX_DV;
logic [7:0] r_Master_RX_Byte;
// Clock Generators:
always #(MAIN_CLK_DELAY) r_Clk = ~r_Clk;
// Instantiate UUT
SPI_Master
#(.SPI_MODE(SPI_MODE),
.CLKS_PER_HALF_BIT(CLKS_PER_HALF_BIT)) SPI_Master_UUT
(
// Control/Data Signals,
.i_Rst_L(r_Rst_L), // FPGA Reset
.i_Clk(r_Clk), // FPGA Clock
// TX (MOSI) Signals
.i_TX_Byte(r_Master_TX_Byte), // Byte to transmit on MOSI
.i_TX_DV(r_Master_TX_DV), // Data Valid Pulse with i_TX_Byte
.o_TX_Ready(w_Master_TX_Ready), // Transmit Ready for Byte
// RX (MISO) Signals
.o_RX_DV(r_Master_RX_DV), // Data Valid pulse (1 clock cycle)
.o_RX_Byte(r_Master_RX_Byte), // Byte received on MISO
// SPI Interface
.o_SPI_Clk(w_SPI_Clk),
.i_SPI_MISO(w_SPI_MOSI),
.o_SPI_MOSI(w_SPI_MOSI)
);
// Sends a single byte from master.
task SendSingleByte(input [7:0] data);
@(posedge r_Clk);
r_Master_TX_Byte <= data;
r_Master_TX_DV <= 1'b1;
@(posedge r_Clk);
r_Master_TX_DV <= 1'b0;
@(posedge w_Master_TX_Ready);
endtask // SendSingleByte
initial
begin
// Required for EDA Playground
$dumpfile("dump.vcd");
$dumpvars;
repeat(10) @(posedge r_Clk);
r_Rst_L = 1'b0;
repeat(10) @(posedge r_Clk);
r_Rst_L = 1'b1;
// Test single byte
SendSingleByte(8'hC1);
$display("Sent out 0xC1, Received 0x%X", r_Master_RX_Byte);
// Test double byte
SendSingleByte(8'hBE);
$display("Sent out 0xBE, Received 0x%X", r_Master_RX_Byte);
SendSingleByte(8'hEF);
$display("Sent out 0xEF, Received 0x%X", r_Master_RX_Byte);
repeat(10) @(posedge r_Clk);
$finish();
end // initial begin
endmodule // SPI_Slave
这是输出:
ERROR:HDLCompiler:1366 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 53: Multiple statement function/task without begin/end not supported in this mode of Verilog
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 12: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 13: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 14: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 15: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 18: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 19: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 20: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 21: logic is an unknown type
ERROR:HDLCompiler:1059 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 22: logic is an unknown type
ERROR:HDLCompiler:598 - "/home/ise/SPIMaster/SPI_Master_TB.v" Line 6: Module <SPI_Master_TB> ignored due to previous errors.
解决方案
logic
由程序编码 (ex: always
block, task
, ) 分配的Afunction
应转换reg
为其 Verilog 等效项。
logic
通过连续赋值(例如:语句或模块实例上的输出)分配的Aassign
应转换wire
为其 Verilog 等效项。
在您的具体情况下,看起来所有logic
以“r_”开头的都应该是reg
,而“w_”应该是wire
Verilog 要求任务/函数的主体代码由 a 包围begin
end
(SystemVerilog 自动推断这一点)。您对此的错误消息应该是不言自明的。
推荐阅读
- laravel - Laravel 6 $request->file('myfile') 总是返回 null
- python - 如果我不将输入数据居中,为什么我的线性回归模型会失败?
- javascript - 我需要检查一个数字是否不是小数,我正在尝试使用 Number.isInteger() 但不起作用
- python - 熊猫数据框选择具有多列字符串条件的行
- c# - UnauthorizedAccessException 通过 FTP 下载 .exe 文件时
- salesforce - 使用 Apex 触发器更新相关记录
- angular - VS Code - 如何从 Angular html 模板创建方法?
- python - 让Python从URL打开一张图片
- c++ - 构建堆的时间复杂度
- bash - 从 Bash 中的字符串末尾删除破折号分隔的数字