Search code examples
vhdlverilogsystem-veriloghdl

VHDL to Verilog


I have some code in VHDL I am trying to convert to Verilog.

The VHDL code works fine

library ieee;                                
use ieee.std_logic_1164.all;                 
                                             
entity find_errors is port(                      
    a: bit_vector(0 to 3);                   
    b: out std_logic_vector(3 downto 0);         
    c: in bit_vector(5 downto 0));            
end find_errors;                            
                                             
architecture not_good of find_errors is        
  begin                                      
  my_label: process (a,c)                         
    begin                                    
    if c = "111111" then                                
      b <= To_StdLogicVector(a);                                
    else                                     
     b <= "0101";                            
    end if;                                   
  end process;                              
end not_good;                                 

The Verilog code I have, gets errors "Illegal reference to net "bw"." and Register is illegal in left-hand side of continuous assignment

module find_errors(                            
  input  [3:0]a,                             
  output [3:0]b,                             
  input [5:0]c                               
);                                            
  wire [0:3]aw;                              
  wire [3:0]bw;                             
  reg [5:0]creg;                              
                                       
  assign aw = a;                             
  assign b = bw;                             
  assign creg = c;                          
always @(a,c)                                      
  begin                                      
    if (creg == 4'b1111)   
       bw <= aw;                              
    else                                     
     bw <= 4'b0101;                            
    end                                                          
endmodule 

Solution

  • It looks pretty close but there are a few things that are problems/errors that need to be fixed, see inline comments in fixed code:

    module find_errors(                            
      input  wire [3:0] a, // Better to be explicit about the types even if 
                           // its not strictly necessary                            
      output reg  [3:0] b, // As mentioned in the comments, the error youre
                           // seeing is because b is a net type by default; when 
                           // describing logic in any always block, you need to 
                           // use variable types, like reg or logic (for 
                           // SystemVerilog); see the comment for a thread 
                           // describing the difference     
      input wire [5:0] c);                             
      
      // You dont really need any local signals as the logic is pretty simple                       
      
      always @(*) begin // Always use either always @(*), assign or 
                        // always_comb (if using SystemVerilog) for combinational logic                                                                 
        if (c == 6'b111111)   
          b = a; // For combinational logic, use blocking assignment ("=") 
                 // instead of non-blocking assignment ("<="), NBA is used for 
                 // registers/sequential logic                              
        else                                     
          b = 4'b0101;                            
      end                                                          
    endmodule