Verilog 嵌套条件运算符/mux语法

Verilog 嵌套条件运算符/mux语法,verilog,system-verilog,Verilog,System Verilog,我试图通过一组按钮向扬声器输出音调。我设法使它与一个case语句一起工作,但在尝试将其转换为mux时遇到了困难,因为根据我的指导原则,always_ff中的case语句是不允许的。我不断收到程序性连续赋值错误的错误,我不确定这是什么意思 我的代码如下 module test ( input logic clk50, input logic [1:0] x, output logic speaker ); logic [15:0] count;

我试图通过一组按钮向扬声器输出音调。我设法使它与一个case语句一起工作,但在尝试将其转换为mux时遇到了困难,因为根据我的指导原则,always_ff中的case语句是不允许的。我不断收到程序性连续赋值错误的错误,我不确定这是什么意思

我的代码如下

module test
    (
    input logic clk50,
    input logic [1:0] x,
    output logic speaker
    );

    logic [15:0] count;
    always_ff @ (posedge clk50)
    
    assign count = x[1] ? (x[0] ? {count == 0 ? 17857 : count-1} : {count == 0? 50000 : count-1}):
                                 (x[0] ? {count == 0 ? 50000 : count-1} : 0 );
    

    //begin
    //case (x)
    
        //2'b10: count = count == 0? 50000: count-1;
        //2'b01: count = count == 0? 50000: count-1;
        //2'b00: count = count == 0? 17857: count-1;
        
    //endcase
    //end
    
    always_ff @ (posedge clk50)
    speaker = count == 0? ~speaker:speaker;
    
        
endmodule

模块测试(
输入逻辑clk50,
输入逻辑[1:0]x,
输出逻辑扬声器
);
逻辑[15:0]计数;
始终_ff@(posedge clk50)开始

演讲者程序连续赋值是
始终
块、
初始
块或其他程序块内的
赋值
语句。他们有有限的(如果有的话)支持合成支持。大多数模拟器都支持此功能,但是SystemVerilog LRM自IEEE1800-2005以来一直警告不要使用此功能(您可以阅读§C.4.2中的解释)

一旦程序块到达
assign
语句,该行将被视为连续赋值,直到对同一变量执行不同的
assign
deassign
。在您的情况下,
count
将在
x
count
的任何更改时更新(异步反馈循环)。它将考虑<代码> CLK50第一个PASEDE,只触发程序连续赋值。过了这段时间,时钟就被忽略了


应避免在过程代码中使用
assign
(和
deassign
)。您还应该使用非阻塞分配(
对不起,我的意思是,我让电路在语法方面使用case语句。但在项目参数方面,我不允许在always\u ff块中使用case或if语句。因此,我必须将case语句转换为mux或其他形式,以满足要求
module test(
  input  logic       clk50,
  input  logic [1:0] x,
  output logic       speaker
);
  logic [15:0] count;

  always_ff @ (posedge clk50)begin
    speaker <= (count == 0) ? ~speaker : speaker;
    count   <= ((x == 2'b01)||(x == 2'b10)) ? ((count == 0) ? 50000 : count-1) :
                (x == 2'b00)                ? ((count == 0) ? 17857 : count-1) :
                                                count;
  end
endmodule
always_ff @ (posedge clk50)
  count <= x[1] ? (x[0] ? {count == 0 ? 17857 : count-1} :
                          {count == 0 ? 50000 : count-1}):
                  (x[0] ? {count == 0 ? 50000 : count-1} : 0 );