首页 > 解决方案 > 如何将此 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.

标签: verilog

解决方案


logic由程序编码 (ex: alwaysblock, task, ) 分配的Afunction应转换reg为其 Verilog 等效项。

logic通过连续赋值(例如:语句或模块实例上的输出)分配的Aassign应转换wire为其 Verilog 等效项。

在您的具体情况下,看起来所有logic以“r_”开头的都应该是reg,而“w_”应该是wire

Verilog 要求任务/函数的主体代码由 a 包围begin end(SystemVerilog 自动推断这一点)。您对此的错误消息应该是不言自明的。


推荐阅读