2016-03-03 29 views
1

下面是我對我的模塊代碼:如何在SystemVerilog中籤名擴展?

module sext(input in[3:0], output out[7:0]); 

    always_comb 
     begin 
      if(in[3]==1'b0) 
       assign out = {4'b0000,in}; 
      else 
       assign out = {4'b1111,in}; 
     end 

endmodule 

出於某種原因,這是行不通的。而不是符號擴展它是零擴展。任何想法爲什麼這可能是這種情況?

你需要照顧是

回答

4

我會假設你的意思(input [3:0] in, output [7:0] out)給出的說明。如果這是真的,那麼你需要寫的都是

module sext(input signed [3:0] in, output signed [7:0] out); 

    assign out = in; 

endmodule 

你也可以寫

module sext(input [3:0] in, output [7:0] out); 

    assign out = 8'(signed'(in)); 

endmodule 

也許你甚至不需要寫這個作爲一個單獨的模塊。

2

幾樣東西,

  1. 你還沒有宣佈參加inout數據類型,因此默認情況下它們是wirewire不能在LHS中使用的內部程序塊。參考6.5 Nets and variables (SV LRM 1800-2012)。因此,要麼使用連續賦值,要麼將其聲明爲變量(即reg/logic等)。

  2. unpacked array的任務是在你的例子是非法的,所以無論是使用packed array或遵循第10.10 Unpacked array concatenation (SV LRM 1800-2012)

+0

我認爲這是'default_nettype'。 – sharvil111

0

我看過你的代碼。 代碼中存在一些錯誤,您必須小心編寫代碼。

  1. 您已使用解包數組,因此您的目標元素和實際元素不匹配。 錯誤:目標表達式中元素的數量與源表達式中 元素的數量不匹配。

這個錯誤可以用填充array.So解決,您的目標元素和實際內容相匹配。 這裏是鏈接從哪裏你會得到更好的理解有關打包和解包陣列。 LINK:[http://www.testbench.in/SV_09_ARRAYS.html][1]

2.你必須注意的另一件事是你存儲一些值出信號(變量),如分配= {4'b0000,in}; 所以你必須使用reg數據類型來傷害這個值。 錯誤:非reg類型在此作業的左側無效 當您使用reg數據類型時,則可以將值存儲在out數據類型中。

所以,你的問題解決了。

這裏我還提供了可以正常運行的代碼。

module sext(input [3:0]in, output reg [7:0]out); 

    always_comb 
     begin 
      if(in[3]==1'b0) 
       assign out = {4'b0000,in}; 
      else 
       assign out = {4'b1111,in}; 
     end 

    endmodule 
1

這不是非法的語法,但指定在always塊內使用可能不會做你認爲它的作用。使用分配的電線,不要在初始或始終使用它。

您已經在名稱後面定義了端口範圍,這會導致4位和8位1位數組而不是4位和8位數值。

您已使用{}進行連接,但它們也可用於複製,即{4{1'b1}}

module sext(
    input  [3;0] in, 
    output reg [7:0] out); //ranged defined before name 

    //No assign in always 
    //concatenation with replication 
    always_comb begin 
    out = { {4{in[3]}}, in}; 
    end 

endmodule 

或者:

module sext(
    input  [3;0] in, 
    output  [7:0] out); //out left as wire 

    assign out = { {4{in[3]}}, in}; 
endmodule 
相關問題